• Node.js与webpack(三)


    上一节:Node.js与Webpack笔记(二)-CSDN博客

    从0来一遍(webpack项目)

    将之前的webpack 的纯开发配置,重新创建空白项目,重新做一遍,捋一遍思路防止加入生产模式时候弄混

    1.创建文件夹,VSCode打开文件夹

    2.cmd -> npm init -y

    3.根据需求安装一堆依赖

    1. "devDependencies": {
    2. "@babel/core": "^7.24.0",
    3. "@babel/preset-env": "^7.24.0",
    4. "babel-loader": "^9.1.3",
    5. "css-loader": "^6.10.0",
    6. "eslint": "^8.57.0",
    7. "eslint-webpack-plugin": "^4.0.1",
    8. "html-webpack-plugin": "^5.6.0",
    9. "less-loader": "^12.2.0",
    10. "sass-loader": "^14.1.1",
    11. "style-loader": "^3.3.4",
    12. "stylus-loader": "^8.1.0",
    13. "webpack": "^5.90.3",
    14. "webpack-cli": "^5.1.4",
    15. "webpack-dev-server": "^5.0.2"
    16. }
    使用webpack5:
    npm i webpack webpack-cli -D

    处理css|less|sass|scss|stylus资源:
    npm i style-loader css-loader less-style sass-loader stylus-loader -D

    处理图片资源:

    无,不需要依赖

    过去在 Webpack4 时,我们处理图片资源通过 file-loader 和 url-loader 进行处理

    现在 Webpack5 已经将两个 Loader 功能内置到 Webpack 里了,我们只需要简单配置即可处理图片资源

    处理图形文字、音视频资源:

    无,不需要依赖

    Eslint检查JS、VUE、JSX语法格式:
    npm i eslint eslint-webpack-plugin --save-dev

    Babel处理兼容问题:
    npm install -D babel-loader @babel/core @babel/preset-env

    处理HTML资源:

    以原HTML的结构自动创建HTML,自动引入所有的出口js文件还有CSS等

    npm i html-webpack-plugin -D
    

    webpack提供的小型服务器:
    npm i webpack-dev-server -D
    


    4.手动创建这些文件夹(暂时手动)

    5.写(粘贴)几个配置文件
    webpack.config.js

    配置文件内容:

    1.修改打包入口和出口路径

    2.打包自动清空资源

    3.处理css、less、sass、scss、stylus样式资源

    4.处理文字图标、音视频资源

    5.处理图片资源

    6.Babel:处理JS文件(还需要单独配置文件)

    7.Eslint:检查js语法格式(还需要单独配置文件)

    1. // node.js核心模块path,专门处理路径
    2. const path = require('path');
    3. // 处理HTML文件
    4. const HtmlWebpackPlugin = require('html-webpack-plugin');
    5. // Eslint插件
    6. const ESLintPlugin = require('eslint-webpack-plugin');
    7. // webpack默认支持的是CommonJS语法
    8. module.exports = {
    9. // 入口,相对路径
    10. entry: 'src/main.js',
    11. // 输出
    12. output: {
    13. // __dirname获取当前项目根目录的绝对路径
    14. // dist 为输出目录,自动创建
    15. path: path.resolve(__dirname, "dist"),
    16. // 出口文件名,dist下的
    17. filename: "js/main.js",
    18. // 打包时自动清空上次打包资源
    19. clean: true,
    20. },
    21. // loader加载器
    22. module: {
    23. // 写正则作为匹配规则
    24. rules: [
    25. // 处理css资源
    26. {
    27. // 正则匹配一个 以 .css结尾的文件
    28. test: /\.css$/,
    29. // loader在数组中的执行顺序是从右到左
    30. // style-loader将js中的css通过创建style标签的形式添加到html文件中生效
    31. // css-loader将css资源编译成commonJS的模板到js中
    32. use: ['style-loader', 'css-loader'],
    33. },
    34. // 处理less资源
    35. {
    36. test: /\.less$/,
    37. use: ['style-loader', "css-loader", "less-loader"],
    38. },
    39. // 处理sass 和 scss资源
    40. {
    41. test: /\.s[ac]ss$/,
    42. use: ["style-loader", "css-loader", "sass-loader"],
    43. },
    44. // 处理stylus资源
    45. {
    46. test: /\.styl$/,
    47. use: ["style-loader", "css-loader", "stylus-loader"],
    48. },
    49. // 处理媒体图片资源
    50. {
    51. test: /\.(png|jpe?g|gif|webp|svg)$/,
    52. // asset提供dataUrl来处理小图片转base64编码
    53. type: "asset",
    54. parser: {
    55. // 小于 10k的图片,进行转字符串处理
    56. // 体积略大一点,换来的是减少一次资源请求
    57. dataUrlCondition: {
    58. maxSize: 10 * 1024,
    59. },
    60. // 修改图片资源输出路径, dist下的
    61. // hash: 8,命名只取生成的hash值的前8位
    62. // ext: 后缀名
    63. // query: 请求头查询字符串(可选)
    64. generator: {
    65. filename: 'static/img/[hash: 8][ext][query]',
    66. },
    67. }
    68. },
    69. // 处理字体图标文件,以及音视频文件
    70. {
    71. test: /\.(ttf|woff2?|mp3|mp4|avi)$/,
    72. type: "asset/resource",// 为什么是这个类型我也不知道,官网上写的
    73. // 修改媒体资源输出路径,dist下的
    74. generator: {
    75. filename: 'static/media/[hash: 8][ext][query]',
    76. },
    77. },
    78. // 处理JS文件,JS解析器:Babel
    79. {
    80. test: /\.js$/,
    81. exclude: /node_modules/, // 排除第三方js文件
    82. loader: 'babel-loader',
    83. },
    84. ]
    85. },
    86. // 插件
    87. plugins: [
    88. // plugin的配置
    89. new ESLintPlugin({
    90. // context指定需要检查的文件根目录,一般只检查src下的文件
    91. context: path.resolve(__dirname, "src"),
    92. }),
    93. new HtmlWebpackPlugin({
    94. // 以public/index.html为模板创建文件
    95. // 新html文件,内容结构与源文件一致,自动引入打包生成的js等资源
    96. template: path.resolve(__dirname, 'public/index.html'),
    97. }),
    98. ],
    99. // 开发服务器配置, webpack官方提供的小型服务器
    100. devServer: {
    101. host: 'localhost', // 启动服务器域名
    102. port: "3030", // 启动服务器端口号
    103. open: true, // 是否自动打开浏览器
    104. },
    105. // 模式
    106. mode: "development", // 选择开发模式
    107. }
    手动创建配置文件需要的文件 
    • 入口文件.js
    • HTML模板插件需要的模板HTML

    .eslintrc.js

    此时eslint其实已经可以用了,每次打包编译时候才开是检测一次代码格式,如果需要实时检测,后面会使用VSCode插件

    1. module.exports ={
    2. // 继承Eslint官方写好的 规则,还是比较主流的
    3. extends: ["eslint:recommended"], // 这里不能加任何空格
    4. env: {
    5. node: true, // 启用node中的全局变量(五大核心那些东西)
    6. browser: true, // 启用浏览器中全员变量 (window,console那些东西)
    7. },
    8. parserOptions: {
    9. ecmaVersion: 6, // ES语法版本,支持ES6
    10. sourceType: "module", // ES 模块化
    11. },
    12. rules: {
    13. "no-var": 2, //不能使用var定义变量
    14. }
    15. }
    babel.config.js

    此时,webpack有了babel插件的帮助,已经可以处理ES6语法了,类似于将箭头函数转换成function(){};

    1. module.exports = {
    2. // @babel/preset-env: 一个智能预设,允许您使用最新的 JavaScript。
    3. // @babel/preset-react:一个用来编译 React jsx 语法的预设
    4. // @babel/preset-typescript:一个用来编译 TypeScript 语法的预设
    5. presets: ["@babel/preset-env"],
    6. }
    6.加一个插件
    VSCode-ESLint

    这个插件可以实时检测代码格式,就不用编译的时候才去报错了

    再给插件写一个配置文件

    但是此时就会对项目所有文件默认进行 Eslint 检查了,我们 dist 目录下的打包后文件就会报错。但是我们开发时候只需要检查 src 下面自己写的源代码,不需要检查 dist 下面的文件。

    eslintignore有可能不生效,有一个办法是在.eslintrc.js中写上:

    网上也有其他办法,但是暂时也不会用

    VSCode ESLint 插件 .eslintignore 文件不生效原因[转] – 后除 (mazey.net)

    7.使用git
    初始化仓库

    创建.gitignore文件
    1. # 忽略 npm下载的第三方包
    2. node_modules
    3. # 忽略分发文件夹
    4. dist
    5. # 忽略VSCode配置文件
    6. .vscode
    7. # 忽略秘钥文件
    8. *.pem
    9. *cer
    10. # 忽略日志文件
    11. *.log
    12. # 忽略.history历史文件夹(可能是一个插件生成的)
    13. .history


    生产模式介绍

    生产模式是开发完成代码后,我们需要得到代码将来部署上线。

    这个模式下我们主要对代码进行优化,让其运行性能更好。

    优化主要从两个角度出发:

    1. 优化代码运行性能
    2. 优化代码打包速度
    • 之前的目录结构

    • 现在的目录

    配置文件

    • webpack.dev.js

    1. // node.js核心模块path,专门处理路径
    2. const path = require('path');
    3. // 处理HTML文件
    4. const HtmlWebpackPlugin = require('html-webpack-plugin');
    5. // Eslint插件
    6. const ESLintPlugin = require('eslint-webpack-plugin');
    7. // webpack默认支持的是CommonJS语法
    8. module.exports = {
    9. // 入口,相对路径,从项目根目录为起点,这里必须加上 ./
    10. entry: './src/main.js',
    11. // 输出
    12. output: {
    13. // __dirname获取当前项目根目录的绝对路径
    14. path: undefined, // 开发模式不输出
    15. // 出口文件名,dist下的
    16. filename: "static/js/main.js",
    17. // 打包时自动清空上次打包资源
    18. // clean: true, // 开发模式没有输出,不清空
    19. },
    20. // loader加载器
    21. module: {
    22. // 写正则作为匹配规则
    23. rules: [
    24. // 处理css资源
    25. {
    26. // 正则匹配一个 以 .css结尾的文件
    27. test: /\.css$/,
    28. // loader在数组中的执行顺序是从右到左
    29. // style-loader将js中的css通过创建style标签的形式添加到html文件中生效
    30. // css-loader将css资源编译成commonJS的模板到js中
    31. use: ['style-loader', 'css-loader'],
    32. },
    33. // 处理less资源
    34. {
    35. test: /\.less$/,
    36. use: ['style-loader', "css-loader", "less-loader"],
    37. },
    38. // 处理sass 和 scss资源
    39. {
    40. test: /\.s[ac]ss$/,
    41. use: ["style-loader", "css-loader", "sass-loader"],
    42. },
    43. // 处理stylus资源
    44. {
    45. test: /\.styl$/,
    46. use: ["style-loader", "css-loader", "stylus-loader"],
    47. },
    48. // 处理媒体图片资源
    49. {
    50. test: /\.(png|jpe?g|gif|webp|svg)$/,
    51. // asset提供dataUrl来处理小图片转base64编码
    52. type: "asset",
    53. parser: {
    54. // 小于 10k的图片,进行转字符串处理
    55. // 体积略大一点,换来的是减少一次资源请求
    56. dataUrlCondition: {
    57. maxSize: 10 * 1024,
    58. },
    59. // 修改图片资源输出路径, dist下的
    60. // hash: 8,命名只取生成的hash值的前8位
    61. // ext: 后缀名
    62. // query: 请求头查询字符串(可选)
    63. generator: {
    64. filename: 'static/img/[hash: 8][ext][query]',
    65. },
    66. }
    67. },
    68. // 处理字体图标文件,以及音视频文件
    69. {
    70. test: /\.(ttf|woff2?|mp3|mp4|avi)$/,
    71. type: "asset/resource",// 为什么是这个类型我也不知道,官网上写的
    72. // 修改媒体资源输出路径,dist下的
    73. generator: {
    74. filename: 'static/media/[hash: 8][ext][query]',
    75. },
    76. },
    77. // 处理JS文件,JS解析器:Babel
    78. {
    79. test: /\.js$/,
    80. exclude: /node_modules/, // 排除第三方js文件
    81. loader: 'babel-loader',
    82. },
    83. ]
    84. },
    85. // 插件
    86. plugins: [
    87. // plugin的配置
    88. new ESLintPlugin({
    89. // context指定需要检查的文件根目录,一般只检查src下的文件
    90. context: path.resolve(__dirname, "../src"),
    91. }),
    92. new HtmlWebpackPlugin({
    93. // 以public/index.html为模板创建文件
    94. // 新html文件,内容结构与源文件一致,自动引入打包生成的js等资源
    95. template: path.resolve(__dirname, '../public/index.html'),
    96. }),
    97. ],
    98. // 开发服务器配置, webpack官方提供的小型服务器
    99. devServer: {
    100. host: 'localhost', // 启动服务器域名
    101. port: "3030", // 启动服务器端口号
    102. open: true, // 是否自动打开浏览器
    103. },
    104. // 模式
    105. mode: "development", // 选择开发模式
    106. }

     运行指令

    npx webpack serve --config config/webpack.dev.js

     

    • webpack.prod.js

    1. // node.js核心模块path,专门处理路径
    2. const path = require('path');
    3. // 处理HTML文件
    4. const HtmlWebpackPlugin = require('html-webpack-plugin');
    5. // Eslint插件
    6. const ESLintPlugin = require('eslint-webpack-plugin');
    7. // webpack默认支持的是CommonJS语法
    8. module.exports = {
    9. // 入口,相对路径
    10. entry: './src/main.js',
    11. // 输出
    12. output: {
    13. // __dirname获取当前项目根目录的绝对路径
    14. // dist 为输出目录,自动创建
    15. path: path.resolve(__dirname, "../dist"), // 生产模式需要输出
    16. // 出口文件名,dist下的
    17. filename: "static/js/main.js",
    18. // 打包时自动清空上次打包资源
    19. clean: true,
    20. },
    21. // loader加载器
    22. module: {
    23. // 写正则作为匹配规则
    24. rules: [
    25. // 处理css资源
    26. {
    27. // 正则匹配一个 以 .css结尾的文件
    28. test: /\.css$/,
    29. // loader在数组中的执行顺序是从右到左
    30. // style-loader将js中的css通过创建style标签的形式添加到html文件中生效
    31. // css-loader将css资源编译成commonJS的模板到js中
    32. use: ['style-loader', 'css-loader'],
    33. },
    34. // 处理less资源
    35. {
    36. test: /\.less$/,
    37. use: ['style-loader', "css-loader", "less-loader"],
    38. },
    39. // 处理sass 和 scss资源
    40. {
    41. test: /\.s[ac]ss$/,
    42. use: ["style-loader", "css-loader", "sass-loader"],
    43. },
    44. // 处理stylus资源
    45. {
    46. test: /\.styl$/,
    47. use: ["style-loader", "css-loader", "stylus-loader"],
    48. },
    49. // 处理媒体图片资源
    50. {
    51. test: /\.(png|jpe?g|gif|webp|svg)$/,
    52. // asset提供dataUrl来处理小图片转base64编码
    53. type: "asset",
    54. parser: {
    55. // 小于 10k的图片,进行转字符串处理
    56. // 体积略大一点,换来的是减少一次资源请求
    57. dataUrlCondition: {
    58. maxSize: 10 * 1024,
    59. },
    60. // 修改图片资源输出路径, dist下的
    61. // hash: 8,命名只取生成的hash值的前8位
    62. // ext: 后缀名
    63. // query: 请求头查询字符串(可选)
    64. generator: {
    65. filename: 'static/img/[hash: 8][ext][query]',
    66. },
    67. }
    68. },
    69. // 处理字体图标文件,以及音视频文件
    70. {
    71. test: /\.(ttf|woff2?|mp3|mp4|avi)$/,
    72. type: "asset/resource",// 为什么是这个类型我也不知道,官网上写的
    73. // 修改媒体资源输出路径,dist下的
    74. generator: {
    75. filename: 'static/media/[hash: 8][ext][query]',
    76. },
    77. },
    78. // 处理JS文件,JS解析器:Babel
    79. {
    80. test: /\.js$/,
    81. exclude: /node_modules/, // 排除第三方js文件
    82. loader: 'babel-loader',
    83. },
    84. ]
    85. },
    86. // 插件
    87. plugins: [
    88. // plugin的配置
    89. new ESLintPlugin({
    90. // context指定需要检查的文件根目录,一般只检查src下的文件
    91. context: path.resolve(__dirname, "../src"),
    92. }),
    93. new HtmlWebpackPlugin({
    94. // 以public/index.html为模板创建文件
    95. // 新html文件,内容结构与源文件一致,自动引入打包生成的js等资源
    96. template: path.resolve(__dirname, '../public/index.html'),
    97. }),
    98. ],
    99. // 开发服务器配置, webpack官方提供的小型服务器
    100. // devServer: {
    101. // host: 'localhost', // 启动服务器域名
    102. // port: "3030", // 启动服务器端口号
    103. // open: true, // 是否自动打开浏览器
    104. // },
    105. // 模式
    106. mode: "production", // 选择开发模式
    107. }

     运行指令

    npx webpack serve --config config/webpack.prod.js

     

    报错的点

    在entry处,必须加上 ./,在我的印象里,./src 和 src没区别啊,但是这里必须加上 ./

    eslint配置文件中,继承官方规则这里,不能加任何空格,比如【eslint: recommended】

    配置快速运行指令

    在script中:

    1. "start": "npm run dev",
    2. "dev": "npx webpack serve --config ./config/webpack.dev.js",
    3. "build": "npx webpack --config ./config/webpack.prod.js"

    npm start = npm run dev = npx webpack serve

    以后启动指令:

    • 开发模式:npm start 或 npm run dev
    • 生产模式:npm run build

    CSS处理(还需要额外依赖)

    1.提取成独立的css文件
    安装依赖
    npm i mini-css-extract-plugin -D

    Css 文件目前被打包到 js 文件中,当 js 文件加载时,会创建一个 style 标签来生成样式

    这样对于网站来说,会出现闪屏现象,用户体验不好

    我们应该是单独的 Css 文件,通过 link 标签加载性能才好

    • webpack.prod.js
    1. // node.js核心模块path,专门处理路径
    2. const path = require('path');
    3. // 处理HTML文件
    4. const HtmlWebpackPlugin = require('html-webpack-plugin');
    5. // Eslint插件
    6. const ESLintPlugin = require('eslint-webpack-plugin');
    7. // 处理CSS从默认style标签 到 link标签
    8. const MiniCssExtractPlugin = require('mini-css-extract-plugin');
    9. // webpack默认支持的是CommonJS语法
    10. module.exports = {
    11. // 入口,相对路径
    12. entry: './src/main.js',
    13. // 输出
    14. output: {
    15. // __dirname获取当前项目根目录的绝对路径
    16. // dist 为输出目录,自动创建
    17. path: path.resolve(__dirname, "../dist"), // 生产模式需要输出
    18. // 出口文件名,dist下的
    19. filename: "static/js/main.js",
    20. // 打包时自动清空上次打包资源
    21. clean: true,
    22. },
    23. // loader加载器
    24. module: {
    25. // 写正则作为匹配规则
    26. rules: [
    27. // 处理css资源
    28. {
    29. // 正则匹配一个 以 .css结尾的文件
    30. test: /\.css$/,
    31. // loader在数组中的执行顺序是从右到左
    32. // style-loader将js中的css通过创建style标签的形式添加到html文件中生效
    33. // css-loader将css资源编译成commonJS的模板到js中
    34. // use: ['style-loader', 'css-loader'],
    35. use: [MiniCssExtractPlugin.loader, 'css-loader'],
    36. },
    37. // 处理less资源
    38. {
    39. test: /\.less$/,
    40. // use: ['style-loader', "css-loader", "less-loader"],
    41. use: [MiniCssExtractPlugin.loader, "css-loader", "less-loader"],
    42. },
    43. // 处理sass 和 scss资源
    44. {
    45. test: /\.s[ac]ss$/,
    46. // use: ["style-loader", "css-loader", "sass-loader"],
    47. use: [MiniCssExtractPlugin.loader, "css-loader", "sass-loader"],
    48. },
    49. // 处理stylus资源
    50. {
    51. test: /\.styl$/,
    52. // use: ["style-loader", "css-loader", "stylus-loader"],
    53. use: [MiniCssExtractPlugin.loader, 'css-loader','stylus-loader'],
    54. },
    55. // 处理媒体图片资源
    56. {
    57. test: /\.(png|jpe?g|gif|webp|svg)$/,
    58. // asset提供dataUrl来处理小图片转base64编码
    59. type: "asset",
    60. parser: {
    61. // 小于 10k的图片,进行转字符串处理
    62. // 体积略大一点,换来的是减少一次资源请求
    63. dataUrlCondition: {
    64. maxSize: 10 * 1024,
    65. },
    66. // 修改图片资源输出路径, dist下的
    67. // hash: 8,命名只取生成的hash值的前8位
    68. // ext: 后缀名
    69. // query: 请求头查询字符串(可选)
    70. generator: {
    71. filename: 'static/img/[hash: 8][ext][query]',
    72. },
    73. }
    74. },
    75. // 处理字体图标文件,以及音视频文件
    76. {
    77. test: /\.(ttf|woff2?|mp3|mp4|avi)$/,
    78. type: "asset/resource",// 为什么是这个类型我也不知道,官网上写的
    79. // 修改媒体资源输出路径,dist下的
    80. generator: {
    81. filename: 'static/media/[hash: 8][ext][query]',
    82. },
    83. },
    84. // 处理JS文件,JS解析器:Babel
    85. {
    86. test: /\.js$/,
    87. exclude: /node_modules/, // 排除第三方js文件
    88. loader: 'babel-loader',
    89. },
    90. ]
    91. },
    92. // 插件
    93. plugins: [
    94. // plugin的配置
    95. new ESLintPlugin({
    96. // context指定需要检查的文件根目录,一般只检查src下的文件
    97. context: path.resolve(__dirname, "../src"),
    98. }),
    99. new HtmlWebpackPlugin({
    100. // 以public/index.html为模板创建文件
    101. // 新html文件,内容结构与源文件一致,自动引入打包生成的js等资源
    102. template: path.resolve(__dirname, '../public/index.html'),
    103. }),
    104. // 提取css成单独文件
    105. new MiniCssExtractPlugin({
    106. // 定义输出文件名和目录
    107. filename: "static/css/main.css",
    108. }),
    109. ],
    110. // 开发服务器配置, webpack官方提供的小型服务器
    111. // devServer: {
    112. // host: 'localhost', // 启动服务器域名
    113. // port: "3030", // 启动服务器端口号
    114. // open: true, // 是否自动打开浏览器
    115. // },
    116. // 模式
    117. mode: "production", // 选择开发模式
    118. }

    运行命令
    npm run build

    2.CSS兼容性处理
    安装依赖
    npm i postcss-loader postcss postcss-preset-env -D
    • webpack.prod.js

    1. // node.js核心模块path,专门处理路径
    2. const path = require('path');
    3. // 处理HTML文件
    4. const HtmlWebpackPlugin = require('html-webpack-plugin');
    5. // Eslint插件
    6. const ESLintPlugin = require('eslint-webpack-plugin');
    7. // 处理CSS从默认style标签 到 link标签
    8. const MiniCssExtractPlugin = require('mini-css-extract-plugin');
    9. // webpack默认支持的是CommonJS语法
    10. module.exports = {
    11. // 入口,相对路径
    12. entry: './src/main.js',
    13. // 输出
    14. output: {
    15. // __dirname获取当前项目根目录的绝对路径
    16. // dist 为输出目录,自动创建
    17. path: path.resolve(__dirname, "../dist"), // 生产模式需要输出
    18. // 出口文件名,dist下的
    19. filename: "static/js/main.js",
    20. // 打包时自动清空上次打包资源
    21. clean: true,
    22. },
    23. // loader加载器
    24. module: {
    25. // 写正则作为匹配规则
    26. rules: [
    27. // 处理css资源
    28. {
    29. // 正则匹配一个 以 .css结尾的文件
    30. test: /\.css$/,
    31. // loader在数组中的执行顺序是从右到左
    32. // style-loader将js中的css通过创建style标签的形式添加到html文件中生效
    33. // css-loader将css资源编译成commonJS的模板到js中
    34. // use: ['style-loader', 'css-loader'],
    35. use: [MiniCssExtractPlugin.loader,
    36. {
    37. loader: "postcss-loader",
    38. options: {
    39. postcssOptions: {
    40. plugins: [
    41. "postcss-preset-env", // 能解决大多数样式兼容性问题
    42. ],
    43. },
    44. },
    45. },
    46. 'css-loader'],
    47. },
    48. // 处理less资源
    49. {
    50. test: /\.less$/,
    51. // use: ['style-loader', "css-loader", "less-loader"],
    52. use: [MiniCssExtractPlugin.loader, "css-loader",
    53. {
    54. loader: "postcss-loader",
    55. options: {
    56. postcssOptions: {
    57. plugins: [
    58. "postcss-preset-env", // 能解决大多数样式兼容性问题
    59. ],
    60. },
    61. },
    62. },
    63. "less-loader"],
    64. },
    65. // 处理sass 和 scss资源
    66. {
    67. test: /\.s[ac]ss$/,
    68. // use: ["style-loader", "css-loader", "sass-loader"],
    69. use: [MiniCssExtractPlugin.loader, "css-loader",
    70. {
    71. loader: "postcss-loader",
    72. options: {
    73. postcssOptions: {
    74. plugins: [
    75. "postcss-preset-env", // 能解决大多数样式兼容性问题
    76. ],
    77. },
    78. },
    79. },
    80. "sass-loader"],
    81. },
    82. // 处理stylus资源
    83. {
    84. test: /\.styl$/,
    85. // use: ["style-loader", "css-loader", "stylus-loader"],
    86. use: [MiniCssExtractPlugin.loader, 'css-loader',
    87. {
    88. loader: "postcss-loader",
    89. options: {
    90. postcssOptions: {
    91. plugins: [
    92. "postcss-preset-env", // 能解决大多数样式兼容性问题
    93. ],
    94. },
    95. },
    96. },
    97. 'stylus-loader'],
    98. },
    99. // 处理媒体图片资源
    100. {
    101. test: /\.(png|jpe?g|gif|webp|svg)$/,
    102. // asset提供dataUrl来处理小图片转base64编码
    103. type: "asset",
    104. parser: {
    105. // 小于 10k的图片,进行转字符串处理
    106. // 体积略大一点,换来的是减少一次资源请求
    107. dataUrlCondition: {
    108. maxSize: 10 * 1024,
    109. },
    110. // 修改图片资源输出路径, dist下的
    111. // hash: 8,命名只取生成的hash值的前8位
    112. // ext: 后缀名
    113. // query: 请求头查询字符串(可选)
    114. generator: {
    115. filename: 'static/img/[hash: 8][ext][query]',
    116. },
    117. }
    118. },
    119. // 处理字体图标文件,以及音视频文件
    120. {
    121. test: /\.(ttf|woff2?|mp3|mp4|avi)$/,
    122. type: "asset/resource",// 为什么是这个类型我也不知道,官网上写的
    123. // 修改媒体资源输出路径,dist下的
    124. generator: {
    125. filename: 'static/media/[hash: 8][ext][query]',
    126. },
    127. },
    128. // 处理JS文件,JS解析器:Babel
    129. {
    130. test: /\.js$/,
    131. exclude: /node_modules/, // 排除第三方js文件
    132. loader: 'babel-loader',
    133. },
    134. ]
    135. },
    136. // 插件
    137. plugins: [
    138. // plugin的配置
    139. new ESLintPlugin({
    140. // context指定需要检查的文件根目录,一般只检查src下的文件
    141. context: path.resolve(__dirname, "../src"),
    142. }),
    143. new HtmlWebpackPlugin({
    144. // 以public/index.html为模板创建文件
    145. // 新html文件,内容结构与源文件一致,自动引入打包生成的js等资源
    146. template: path.resolve(__dirname, '../public/index.html'),
    147. }),
    148. // 提取css成单独文件
    149. new MiniCssExtractPlugin({
    150. // 定义输出文件名和目录
    151. filename: "static/css/main.css",
    152. }),
    153. ],
    154. // 开发服务器配置, webpack官方提供的小型服务器
    155. // devServer: {
    156. // host: 'localhost', // 启动服务器域名
    157. // port: "3030", // 启动服务器端口号
    158. // open: true, // 是否自动打开浏览器
    159. // },
    160. // 模式
    161. mode: "production", // 选择开发模式
    162. }
     控制兼容性

    我们可以在 package.json 文件中添加 browserslist 来控制样式的兼容性做到什么程度。

    以上为了测试兼容性所以设置兼容浏览器 ie8 以上。

    实际开发中我们一般不考虑旧版本浏览器了,所以我们可以这样设置:

    • package.json

    "last 2 version":无论什么浏览器只支持最近的两个版本

    "> 1%":支持99%的浏览器

    "not dead":有的浏览器发展的过程中死了(我也不懂什么是死了,可能是不维护了),就不支持了

    "browserslist": ["last 2 version", "> 1%", "not dead"]

    想要知道更多的 browserslist 配置,查看browserslist官网GitHub - browserslist/browserslist: 🦔 Share target browsers between different front-end tools, like Autoprefixer, Stylelint and babel-preset-env

    运行命令
    npm run build

    合并配置(简便写法) 

    1. // node.js核心模块path,专门处理路径
    2. const path = require('path');
    3. // 处理HTML文件
    4. const HtmlWebpackPlugin = require('html-webpack-plugin');
    5. // Eslint插件
    6. const ESLintPlugin = require('eslint-webpack-plugin');
    7. // 处理CSS从默认style标签 到 link标签
    8. const MiniCssExtractPlugin = require('mini-css-extract-plugin');
    9. // 获取处理样式的Loaders
    10. const getStyleLoaders = (preProcessor) => {
    11. return [
    12. MiniCssExtractPlugin.loader,
    13. "css-loader",
    14. {
    15. loader: "postcss-loader",
    16. options: {
    17. postcssOptions: {
    18. plugins: [
    19. "postcss-preset-env", // 能解决大多数样式兼容性问题
    20. ],
    21. },
    22. },
    23. },
    24. preProcessor,
    25. ].filter(Boolean);
    26. };
    27. // webpack默认支持的是CommonJS语法
    28. module.exports = {
    29. // 入口,相对路径
    30. entry: './src/main.js',
    31. // 输出
    32. output: {
    33. // __dirname获取当前项目根目录的绝对路径
    34. // dist 为输出目录,自动创建
    35. path: path.resolve(__dirname, "../dist"), // 生产模式需要输出
    36. // 出口文件名,dist下的
    37. filename: "static/js/main.js",
    38. // 打包时自动清空上次打包资源
    39. clean: true,
    40. },
    41. // loader加载器
    42. module: {
    43. // 写正则作为匹配规则
    44. rules: [
    45. // 处理css资源
    46. {
    47. // 正则匹配一个 以 .css结尾的文件
    48. test: /\.css$/,
    49. // loader在数组中的执行顺序是从右到左
    50. // style-loader将js中的css通过创建style标签的形式添加到html文件中生效
    51. // css-loader将css资源编译成commonJS的模板到js中
    52. // use: ['style-loader', 'css-loader'],
    53. // use: [MiniCssExtractPlugin.loader,
    54. // {
    55. // loader: "postcss-loader",
    56. // options: {
    57. // postcssOptions: {
    58. // plugins: [
    59. // "postcss-preset-env", // 能解决大多数样式兼容性问题
    60. // ],
    61. // },
    62. // },
    63. // },
    64. // 'css-loader'],
    65. use: getStyleLoaders(),
    66. },
    67. // 处理less资源
    68. {
    69. test: /\.less$/,
    70. // use: ['style-loader', "css-loader", "less-loader"],
    71. // use: [MiniCssExtractPlugin.loader, "css-loader",
    72. // {
    73. // loader: "postcss-loader",
    74. // options: {
    75. // postcssOptions: {
    76. // plugins: [
    77. // "postcss-preset-env", // 能解决大多数样式兼容性问题
    78. // ],
    79. // },
    80. // },
    81. // },
    82. // "less-loader"],
    83. use: getStyleLoaders("less-loader"),
    84. },
    85. // 处理sass 和 scss资源
    86. {
    87. test: /\.s[ac]ss$/,
    88. // use: ["style-loader", "css-loader", "sass-loader"],
    89. // use: [MiniCssExtractPlugin.loader, "css-loader",
    90. // {
    91. // loader: "postcss-loader",
    92. // options: {
    93. // postcssOptions: {
    94. // plugins: [
    95. // "postcss-preset-env", // 能解决大多数样式兼容性问题
    96. // ],
    97. // },
    98. // },
    99. // },
    100. // "sass-loader"],
    101. use: getStyleLoaders("sass-loader"),
    102. },
    103. // 处理stylus资源
    104. {
    105. test: /\.styl$/,
    106. // use: ["style-loader", "css-loader", "stylus-loader"],
    107. // use: [MiniCssExtractPlugin.loader, 'css-loader',
    108. // {
    109. // loader: "postcss-loader",
    110. // options: {
    111. // postcssOptions: {
    112. // plugins: [
    113. // "postcss-preset-env", // 能解决大多数样式兼容性问题
    114. // ],
    115. // },
    116. // },
    117. // },
    118. // 'stylus-loader'],
    119. use: getStyleLoaders("stylus-loader"),
    120. },
    121. // 处理媒体图片资源
    122. {
    123. test: /\.(png|jpe?g|gif|webp|svg)$/,
    124. // asset提供dataUrl来处理小图片转base64编码
    125. type: "asset",
    126. parser: {
    127. // 小于 10k的图片,进行转字符串处理
    128. // 体积略大一点,换来的是减少一次资源请求
    129. dataUrlCondition: {
    130. maxSize: 10 * 1024,
    131. },
    132. // 修改图片资源输出路径, dist下的
    133. // hash: 8,命名只取生成的hash值的前8位
    134. // ext: 后缀名
    135. // query: 请求头查询字符串(可选)
    136. generator: {
    137. filename: 'static/img/[hash: 8][ext][query]',
    138. },
    139. }
    140. },
    141. // 处理字体图标文件,以及音视频文件
    142. {
    143. test: /\.(ttf|woff2?|mp3|mp4|avi)$/,
    144. type: "asset/resource",// 为什么是这个类型我也不知道,官网上写的
    145. // 修改媒体资源输出路径,dist下的
    146. generator: {
    147. filename: 'static/media/[hash: 8][ext][query]',
    148. },
    149. },
    150. // 处理JS文件,JS解析器:Babel
    151. {
    152. test: /\.js$/,
    153. exclude: /node_modules/, // 排除第三方js文件
    154. loader: 'babel-loader',
    155. },
    156. ]
    157. },
    158. // 插件
    159. plugins: [
    160. // plugin的配置
    161. new ESLintPlugin({
    162. // context指定需要检查的文件根目录,一般只检查src下的文件
    163. context: path.resolve(__dirname, "../src"),
    164. }),
    165. new HtmlWebpackPlugin({
    166. // 以public/index.html为模板创建文件
    167. // 新html文件,内容结构与源文件一致,自动引入打包生成的js等资源
    168. template: path.resolve(__dirname, '../public/index.html'),
    169. }),
    170. // 提取css成单独文件
    171. new MiniCssExtractPlugin({
    172. // 定义输出文件名和目录
    173. filename: "static/css/main.css",
    174. }),
    175. ],
    176. // 开发服务器配置, webpack官方提供的小型服务器
    177. // devServer: {
    178. // host: 'localhost', // 启动服务器域名
    179. // port: "3030", // 启动服务器端口号
    180. // open: true, // 是否自动打开浏览器
    181. // },
    182. // 模式
    183. mode: "production", // 选择开发模式
    184. }
    运行命令
    npm run build

    3.CSS压缩
    安装依赖
    npm i css-minimizer-webpack-plugin -D

    • webpack.prod.js
    1. // node.js核心模块path,专门处理路径
    2. const path = require('path');
    3. // 处理HTML文件
    4. const HtmlWebpackPlugin = require('html-webpack-plugin');
    5. // Eslint插件
    6. const ESLintPlugin = require('eslint-webpack-plugin');
    7. // 处理CSS从默认style标签 到 link标签
    8. const MiniCssExtractPlugin = require('mini-css-extract-plugin');
    9. // CSS压缩
    10. const CssMinizerPlugin = require('css-minimizer-webpack-plugin');
    11. // 获取处理样式的Loaders
    12. const getStyleLoaders = (preProcessor) => {
    13. return [
    14. MiniCssExtractPlugin.loader,
    15. "css-loader",
    16. {
    17. loader: "postcss-loader",
    18. options: {
    19. postcssOptions: {
    20. plugins: [
    21. "postcss-preset-env", // 能解决大多数样式兼容性问题
    22. ],
    23. },
    24. },
    25. },
    26. preProcessor,
    27. ].filter(Boolean);
    28. };
    29. // webpack默认支持的是CommonJS语法
    30. module.exports = {
    31. // 入口,相对路径
    32. entry: './src/main.js',
    33. // 输出
    34. output: {
    35. // __dirname获取当前项目根目录的绝对路径
    36. // dist 为输出目录,自动创建
    37. path: path.resolve(__dirname, "../dist"), // 生产模式需要输出
    38. // 出口文件名,dist下的
    39. filename: "static/js/main.js",
    40. // 打包时自动清空上次打包资源
    41. clean: true,
    42. },
    43. // loader加载器
    44. module: {
    45. // 写正则作为匹配规则
    46. rules: [
    47. // 处理css资源
    48. {
    49. // 正则匹配一个 以 .css结尾的文件
    50. test: /\.css$/,
    51. // loader在数组中的执行顺序是从右到左
    52. // style-loader将js中的css通过创建style标签的形式添加到html文件中生效
    53. // css-loader将css资源编译成commonJS的模板到js中
    54. // use: ['style-loader', 'css-loader'],
    55. // use: [MiniCssExtractPlugin.loader,
    56. // {
    57. // loader: "postcss-loader",
    58. // options: {
    59. // postcssOptions: {
    60. // plugins: [
    61. // "postcss-preset-env", // 能解决大多数样式兼容性问题
    62. // ],
    63. // },
    64. // },
    65. // },
    66. // 'css-loader'],
    67. use: getStyleLoaders(),
    68. },
    69. // 处理less资源
    70. {
    71. test: /\.less$/,
    72. // use: ['style-loader', "css-loader", "less-loader"],
    73. // use: [MiniCssExtractPlugin.loader, "css-loader",
    74. // {
    75. // loader: "postcss-loader",
    76. // options: {
    77. // postcssOptions: {
    78. // plugins: [
    79. // "postcss-preset-env", // 能解决大多数样式兼容性问题
    80. // ],
    81. // },
    82. // },
    83. // },
    84. // "less-loader"],
    85. use: getStyleLoaders("less-loader"),
    86. },
    87. // 处理sass 和 scss资源
    88. {
    89. test: /\.s[ac]ss$/,
    90. // use: ["style-loader", "css-loader", "sass-loader"],
    91. // use: [MiniCssExtractPlugin.loader, "css-loader",
    92. // {
    93. // loader: "postcss-loader",
    94. // options: {
    95. // postcssOptions: {
    96. // plugins: [
    97. // "postcss-preset-env", // 能解决大多数样式兼容性问题
    98. // ],
    99. // },
    100. // },
    101. // },
    102. // "sass-loader"],
    103. use: getStyleLoaders("sass-loader"),
    104. },
    105. // 处理stylus资源
    106. {
    107. test: /\.styl$/,
    108. // use: ["style-loader", "css-loader", "stylus-loader"],
    109. // use: [MiniCssExtractPlugin.loader, 'css-loader',
    110. // {
    111. // loader: "postcss-loader",
    112. // options: {
    113. // postcssOptions: {
    114. // plugins: [
    115. // "postcss-preset-env", // 能解决大多数样式兼容性问题
    116. // ],
    117. // },
    118. // },
    119. // },
    120. // 'stylus-loader'],
    121. use: getStyleLoaders("stylus-loader"),
    122. },
    123. // 处理媒体图片资源
    124. {
    125. test: /\.(png|jpe?g|gif|webp|svg)$/,
    126. // asset提供dataUrl来处理小图片转base64编码
    127. type: "asset",
    128. parser: {
    129. // 小于 10k的图片,进行转字符串处理
    130. // 体积略大一点,换来的是减少一次资源请求
    131. dataUrlCondition: {
    132. maxSize: 10 * 1024,
    133. },
    134. // 修改图片资源输出路径, dist下的
    135. // hash: 8,命名只取生成的hash值的前8位
    136. // ext: 后缀名
    137. // query: 请求头查询字符串(可选)
    138. generator: {
    139. filename: 'static/img/[hash: 8][ext][query]',
    140. },
    141. }
    142. },
    143. // 处理字体图标文件,以及音视频文件
    144. {
    145. test: /\.(ttf|woff2?|mp3|mp4|avi)$/,
    146. type: "asset/resource",// 为什么是这个类型我也不知道,官网上写的
    147. // 修改媒体资源输出路径,dist下的
    148. generator: {
    149. filename: 'static/media/[hash: 8][ext][query]',
    150. },
    151. },
    152. // 处理JS文件,JS解析器:Babel
    153. {
    154. test: /\.js$/,
    155. exclude: /node_modules/, // 排除第三方js文件
    156. loader: 'babel-loader',
    157. },
    158. ]
    159. },
    160. // 插件
    161. plugins: [
    162. // plugin的配置
    163. new ESLintPlugin({
    164. // context指定需要检查的文件根目录,一般只检查src下的文件
    165. context: path.resolve(__dirname, "../src"),
    166. }),
    167. new HtmlWebpackPlugin({
    168. // 以public/index.html为模板创建文件
    169. // 新html文件,内容结构与源文件一致,自动引入打包生成的js等资源
    170. template: path.resolve(__dirname, '../public/index.html'),
    171. }),
    172. // 提取css成单独文件
    173. new MiniCssExtractPlugin({
    174. // 定义输出文件名和目录
    175. filename: "static/css/main.css",
    176. }),
    177. // CSS压缩
    178. new CssMinizerPlugin(),
    179. ],
    180. // 开发服务器配置, webpack官方提供的小型服务器
    181. // devServer: {
    182. // host: 'localhost', // 启动服务器域名
    183. // port: "3030", // 启动服务器端口号
    184. // open: true, // 是否自动打开浏览器
    185. // },
    186. // 模式
    187. mode: "production", // 选择开发模式
    188. }


    HTML 与 js压缩

    默认生产模式已经开启了:html 压缩和 js 压缩

    不需要额外进行配置

    下一篇: 

  • 相关阅读:
    微信小程序 实现滑块是矩形的slider组件
    Windows下通过Ollama部署使用本地模型
    可观测性-可视化-Grafana热图Heatmap
    【云原生】SpringCloud系列之服务调用OpenFeign(日志配置、异常解码器、更改负载均衡策略、替换默认通信组件等)
    【ARM微型电脑/IoT设备/嵌入式】Linux Ubuntu 树莓派 Jetson nano设置PTP时间同步
    f2-python计算阶乘并写出过程--没搞出来--数字的阶乘
    线程安全案例 --- 线程池
    数据结构之查找
    我的项目day02:前端全局样式和js配置,simpleui的使用,跨域问题,cors解决跨域问题,git的下载与安装,pycharm中配置git
    【lesson2】数据库的库操作
  • 原文地址:https://blog.csdn.net/lklalmq/article/details/136581215