• webpack5学习笔记


    基本使用

    1.资源目录:

    webpack_code         #项目根目录(所有指令必须在这个目录下运行

                    |____src   #项目源码目录

                               |___ js #js文件目录

                               |        |__ count.js

                               |        |__ sum.js

                               |____main.js # 项目主文件

    2.创建文件 

    • count.js
    1. export default function count(x,y) {
    2. return x-y;
    3. }
    • sum.js
    1. export default function sum(...args) {
    2. return args.reduce((p, c) => p + c, 0);
    3. }
    • main.js
    1. import count from "./js/count";
    2. import sum from "./js/sum";
    3. console.log(count(2,1));
    4. console.log(sum(1, 2, 3, 4));

    3.下载依赖

    打开终端,来到项目根目录。运行以下指令:

    • 初始化 package.json
    npm init -y

    此时会生成一个基础的package.json 文件。

    需要注意的是 package.json 中 name 字段不能叫做 webpack ,否则下一步会报错

    • 下载依赖
    npm i webpack webpack-cli -D

    4.启用webpack

    • 开发模式
    npx webpack ./src/main.js --mode=development
    • 生产模式
    npx webpack ./src/main.js --mode=production

    npx webpack :是用来运行本地安装 Webpack 包的。

    ./src/main.js :指定 webpack 从 main.js 文件开始打包,不但会打包 main.js ,还会将其它依赖也一起打包进来。

    --mode=xxx :指定模式(环境)

    5.观察输出文件

    默认 Webpack 会将文件打包输出到 dist 目录下,我们查看 dist 目录下文件情况就好了

    小结


    Webpack 本身功能比较少,只能处理 js 资源,一旦遇到 css 等其他资源就会报错。

    所以我们学习 Webpack,就是主要学习如何处理其他资源。

    基本配置

    在开始使用 Webpack 之前,我们需要对 Webpack 的配置有一定的认识。

    5 大核心概念


    1. entry(入口)

    指示 Webpack 从哪个文件开始打包

    2. output (输出)

    指示 Webpack 打包完的文件输出到哪里去,如何命名等

    3. loader(加载器)

    webpack 本身只能处理 js、json 等资源需要借助 loader,Webpack 才能解析

    4. plugins (插件)

    扩展 Webpack 的功能

    5. mode(模式)

    主要由两种模式:

    • 开发模式:development
    • 生产模式:production

    准备 Webpack 配置文件


    在根目录下新建文件:webpack.config.js

    1. const path = require("path"); // nodejs核心模块,专门用来处理路径问题
    2. module.exports = {
    3. // 入口
    4. entry: './src/main.js', // 相对路径
    5. // 输出
    6. output: {
    7. // 文件的输出路径
    8. // __dirname nodejs的变量,代表当前文件的文件夹目录
    9. path: path.resolve(__dirname, "dist"), // 绝对路径
    10. // 文件名
    11. filename: 'main.js',
    12. },
    13. // 加载器
    14. module: {
    15. rules: [
    16. // loader的配置
    17. ]
    18. },
    19. // 插件
    20. plugins: [
    21. // plugin的配置
    22. ],
    23. // 模式
    24. mode: "development",
    25. // mode:"production",
    26. }

    开发模式介绍

    开发模式顾名思义就是我们开发时使用的模式。

    这个模式下我们主要做两件事:

    1.编译代码,使浏览器能识别运行

    开发时我们有样式资源、字体图标、图片资源、html资源等,webpack默认不能处理这些资源,所以我们要加载配置来编译这些资源

    2.代码质量检查,树立代码规范

    提前检查代码的一些隐患,让代码运行时能更加健壮。

    提前检查代码规范和格式,同意团队编码风格,让代码更优雅美观。

    处理样式和图片资源

    学习使用 Webpack 如何处理 Css、Less、Sass、Scss、Styl 以及 png、jpeg 、gif 等图片资源

    介绍


    Webpack 本身是不能识别样式资源的,所以我们需要借助 Loader 来帮助 Webpack 解析样式资源

    我们找 Loader 都应该去官方文档中找到对应的 Loader,然后使用

    官方文档找不到的话,可以从社区 Github 中搜索查询

    Webpack官方Loader文档

    配置:

    1. const path = require("path"); // nodejs核心模块,专门用来处理路径问题
    2. module.exports = {
    3. // 入口
    4. entry: './src/main.js', // 相对路径
    5. // 输出
    6. output: {
    7. // 所有文件的输出路径
    8. // __dirname nodejs的变量,代表当前文件的文件夹目录
    9. path: path.resolve(__dirname, "dist"), // 绝对路径
    10. // 入口文件打包输出文件名
    11. filename: 'main.js',
    12. },
    13. // 加载器
    14. module: {
    15. rules: [
    16. // loader的配置
    17. {
    18. test: /\.css$/, // 只检测 .css文件
    19. use: [ // 执行顺序:从右到左(从下到上)
    20. "style-loader", // 将js中css通过创建style标签添加html文件中生效
    21. "css-loader", // 将css资源编译成 commonjs 的模块到js中
    22. ],
    23. },
    24. {
    25. test: /\.less$/,
    26. // loader:'xxx', // 只能使用1个loader
    27. use: [ // 使用多个loader
    28. // compiles Less to CSS
    29. 'style-loader',
    30. 'css-loader',
    31. 'less-loader', // 将less编译成css文件
    32. ],
    33. },
    34. {
    35. test: /\.s[ac]ss$/,
    36. use: [
    37. // 将 JS 字符串生成为 style 节点
    38. 'style-loader',
    39. // 将 CSS 转化成 CommonJS 模块
    40. 'css-loader',
    41. // 将 Sass 编译成 CSS
    42. 'sass-loader',
    43. ],
    44. },
    45. {
    46. test: /\.styl$/,
    47. use: [
    48. "style-loader",
    49. "css-loader",
    50. "stylus-loader", // 将 Stylus 文件编译为 CSS
    51. ],
    52. },
    53. {
    54. test: /\.(png|jpe?g|gif|webp|svg)$/,
    55. type: 'asset',
    56. }
    57. /* {
    58. test: /\.(png|jpe?g|gif|webp|svg)$/,
    59. type: 'asset',
    60. parser: {
    61. dataUrlCondition: {
    62. // 小于10kb 的图片转base64
    63. // 优点:减少请求数量 缺点:体积会更大
    64. maxSize: 4 * 1024 // 4kb
    65. }
    66. }
    67. } */
    68. ],
    69. },
    70. // 插件
    71. plugins: [
    72. // plugin的配置
    73. ],
    74. // 模式
    75. mode: "development",
    76. // mode:"production",
    77. }

    修改输出资源的名称和路径

    1. const path = require("path"); // nodejs核心模块,专门用来处理路径问题
    2. module.exports = {
    3. entry: './src/main.js', // 相对路径
    4. output: {
    5. // 所有文件的输出路径
    6. // __dirname nodejs的变量,代表当前文件的文件夹目录
    7. path: path.resolve(__dirname, "dist"), // 绝对路径
    8. // 入口文件打包输出文件名
    9. filename: 'static/js/main.js',
    10. },
    11. module: {
    12. rules: [
    13. {
    14. test: /\.css$/,
    15. use: ["style-loader","css-loader"],
    16. },
    17. {
    18. test: /\.(png|jpe?g|gif|webp|svg)$/,
    19. type: 'asset',
    20. generator: {
    21. // [hash:10] 代表hash值只取前10位
    22. filename: 'static/images/[hash:10][ext][query]'
    23. }
    24. }
    25. ],
    26. },
    27. plugins: [],
    28. mode: "development",
    29. // mode:"production",
    30. }

    自动清空上次打包资源

    1. const path = require("path");
    2. module.exports = {
    3. entry: './src/main.js',
    4. output: {
    5. path: path.resolve(__dirname, "dist"),
    6. filename: 'static/js/main.js',
    7. // 自动清空上次打包的内容
    8. // 原理:在打包前,将path整个目录内容清空,再进行打包
    9. clean: true,
    10. },
    11. module: {
    12. rules: [
    13. {}
    14. ],
    15. },
    16. plugins: [],
    17. mode: "development",
    18. // mode:"production",
    19. }

    处理字体图标资源

    1. 下载字体图标文件

    2. 将相应的 css 文件和 fonts (ttf|woff等)文件夹复制到 src 文件夹下(注意:css文件里面路径要做相应修改)

    3. 将相应的css文件引入到main.js文件

    4. 在 html 引入字体图标,记得修改main.js引入的路径,之前修改掉了

     5. 修改配置文件

    1. const path = require("path");
    2. module.exports = {
    3. entry: './src/main.js',
    4. output: {
    5. path: path.resolve(__dirname, "dist"),
    6. filename: 'static/js/main.js',
    7. clean: true,
    8. },
    9. module: {
    10. rules: [
    11. {
    12. test: /\.css$/,
    13. use: ["style-loader","css-loader"],
    14. },
    15. {
    16. test: /\.less$/,
    17. use: ['style-loader','css-loader','less-loader'],
    18. },
    19. {
    20. test: /\.s[ac]ss$/,
    21. use: ['style-loader','css-loader','sass-loader'],
    22. },
    23. {
    24. test: /\.styl$/,
    25. use: ["style-loader","css-loader","stylus-loader"],
    26. },
    27. {
    28. test: /\.(png|jpe?g|gif|webp|svg)$/,
    29. type: 'asset',
    30. generator: {
    31. filename: 'static/images/[hash:10][ext][query]'
    32. }
    33. },
    34. {
    35. test: /\.(ttf|woff2?)$/,
    36. type: 'asset/resource',
    37. generator: {
    38. // 输出名称
    39. filename: 'static/media/[hash:10][ext][query]'
    40. }
    41. },
    42. ],
    43. },
    44. plugins: [],
    45. mode: "development",
    46. // mode:"production",
    47. }

    处理其他资源

    开发中可能还存在一些其他资源,如音视频等,我们也一起处理了

    1.配置

    1. const path = require("path");
    2. module.exports = {
    3. entry: './src/main.js',
    4. output: {
    5. path: path.resolve(__dirname, "dist"),
    6. filename: 'static/js/main.js',
    7. clean: true,
    8. },
    9. module: {
    10. rules: [
    11. {
    12. test: /\.css$/,
    13. use: [ "style-loader","css-loader"],
    14. },
    15. {
    16. test: /\.less$/,
    17. use: ['style-loader','css-loader','less-loader'],
    18. },
    19. {
    20. test: /\.s[ac]ss$/,
    21. use: ['style-loader','css-loader','sass-loader'],
    22. },
    23. {
    24. test: /\.styl$/,
    25. use: ["style-loader","css-loader","stylus-loader"],
    26. },
    27. {
    28. test: /\.(png|jpe?g|gif|webp|svg)$/,
    29. type: 'asset',
    30. generator: {
    31. filename: 'static/images/[hash:10][ext][query]'
    32. }
    33. },
    34. {
    35. // 有其他资源时继续往后添加,就会原封不动输出的
    36. test: /\.(ttf|woff2?|map3|map4|avi)$/,
    37. type: 'asset/resource',
    38. generator: {
    39. filename: 'static/media/[hash:10][ext][query]'
    40. }
    41. },
    42. ],
    43. },
    44. plugins: [],
    45. mode: "development",
    46. // mode:"production",
    47. }

    处理 js 资源

    有人可能会问,js资源 Webpack 不是已经处理了吗,为什么我们还要处理呢?

    原因是 Webpack 对 js 处理是有限的,只能编译 js 中 ES 模块化语法,不能编译其他语法,导致 js 不能在 IE 等浏览器运行,所以我们希望做一些兼容性处理。

    其中开发中,团队对代码格式是有严格要求的,我们不能由肉眼去检测代码格式,需要使用专业的工具来检测。

    • 针对 js 兼容性处理,我们使用 Babel 来完成
    • 针对代码格式,我们使用 Eslint 来完成

    我们先完成 Eslint ,检测代码格式无误后,在由 Babel 做代码兼容性处理

    Eslint


    可组装的 JavaScript 和 JSX 检查工具。

    这句话意思就是:它是用来检测 js 和 jsx 语法的工具,可以配置各项功能

    我们使用 Eslint,关键是写 Eslint 配置文件,里面写上各种 rules 规则,将来运行 Eslint 时就会以写的规则对代码进行检查

    1. 配置文件

    配置文件有很多种写法:

    .eslintrc.* :新建文件,位于项目根目录

    • .eslintrc
    • .eslintrc.js
    • .eslintrc.json
    • 区别在于配置格式不一样

    package.jsoneslintConfig :不需要创建文件,在原文件基础上写 Eslint 会查找和自动读取它们,所以以上配置文件只需要存在一个即可

    2. 具体配置

    我们以 .eslintrc.js 配置文件为例:

    1. module.exports = {
    2. // 解析选项
    3. parserOptions: {},
    4. // 具体检查规则
    5. rules:{},
    6. // 继承其他规则
    7. extends:[],
    8. // ...
    9. // 其他规则详见:https://eslint.bootcss.com/docs/user-guide/configuring
    10. };

    1. parserOptions 解析选项

    1. parserOptions: {
    2. ecmaVersion: 6, // ES 语法版本
    3. sourceType: "module", // ES 模块化
    4. ecmaFeatures:{ // ES 其他特性
    5. jsx: ture // 如果是 React 项目,就需要开启 jsx 语法
    6. }
    7. }

    2. rules 具体规则

    • "off" 0 - 关闭规则
    • "warn" 1 - 开启规则,使用警告级别的错误:warn(不会导致程序退出)
    • "error" 2 - 开启规则,使用错误级别的错误:error(当被触发的时候,程序会退出)
    1. rules: {
    2. semi: "error", // 禁止使用分号
    3. 'array-callback-return': 'warn', // 强制数组方法的回调函数中有 return 语句。否则警告
    4. 'default-case': [
    5. 'warn', // 要求 switch 语句中有 default 分支,否则警告
    6. { commentPattern: '^no default$' } // 允许在最后注释 no default, 就不会有警告了
    7. ],
    8. eqeqeq: [
    9. 'warn', // 强制使用 === 和 !== ,否则警告
    10. 'smart' // https://eslint.bootcss.com/docs/rules/eqeqeq#smart 除了少数情况下不会有警告
    11. ],
    12. }

    更多规则详见:规则文档

    3. extends 继承

    开发中一点点写 rules 规则太费劲了,所以有更好的办法,继承现有的规则。

    现有以下较为有名的规则:

    • Eslint 官方的规则eslint:recommended
    • Vue Cli 官方的规则:plugin:vue/essential
    • React Cli 官方的规则:react-app
    1. // 例如在React项目中,我们可以这样写配置
    2. module.exports = {
    3. extends:["react-app"],
    4. rules:{
    5. // 我们的规则会覆盖掉react-app的规则
    6. // 所以想要修改规则直接改就是了
    7. eqeqeq:["warn","smart"],
    8. },

    3. 在 Webpack 中使用

    1. 下载包

    npm i eslint-webpack-plugin eslint -D

    2. 修改 webpack.config.js 文件

    • webpack.config.js
    1. // 把插件添加到你的 webpack 配置
    2. const ESLintPlugin = require('eslint-webpack-plugin');
    3. module.exports = {
    4. // ...
    5. // 插件
    6. plugins: [
    7. // plugin的配置
    8. new ESLintPlugin({
    9. // 检测哪些文件
    10. context: path.resolve(__dirname, "src")
    11. })
    12. ],
    13. // ...
    14. };

    3. 定义 Eslint 配置文件

    • .eslintrc.js
    1. module.exports = {
    2. // 继承 Eslint 规则
    3. extends: ["eslint:recommended"],
    4. env: {
    5. node: ture, // 启用node中全局变量
    6. browser: true, // 启用浏览器中全局变量
    7. },
    8. parserOptions: {
    9. ecmaVersion: 6,
    10. sourceType: "module",
    11. },
    12. rules: {
    13. "no-var": 2, // 不能使用 var 定义变量
    14. },
    15. };

    4.修改 js 文件代码

    • main.js
    1. import count from "./js/count";
    2. import sum from "./js/sum";
    3. // 要想 webpack 打包资源,必须引入该资源
    4. import "./css/iconfont.css";
    5. import "./css/index.css";
    6. import "./less/index.less";
    7. import "./sass/index.sass";
    8. import "./sass/index.scss";
    9. import "./stylus/index.styl";
    10. const result = count(2, 1); // 不能用 var 会报错
    11. console.log(result);
    12. // console.log(count(2, 1));
    13. console.log(sum(1, 2, 3, 4));

    5. 添加.eslintignore 文件

    由于我在VS Code里添加了Eslint语法检查的插件,而我们不需要他检查输出的js文件,也就是dist文件夹,此时我们要新添加一个配置文件.eslintignore 文件,里面写dist,这样他就会忽略dist文件夹里的js文件,从而不报红色波浪线的错误

    • .eslintignore
    dist

    Babel


    JavaScript 编译器。

    主要用于将 ES6 语法编写的代码转换为向后兼容的JavaScript 语法,以便能够运行在当前和旧版本的浏览器或其他环境中。

    1. 配置文件

    配置文件有很多种写法:

    babel.config.* :新建文件,位于项目根目录

    • babel.config.js
    • babel.config.json

    .babelrc.* :新建文件,位于项目根目录

    • .babelrc
    • .babelrc.js
    • .babelrc.json

    package.json 中  babel :不需要创建文件,在原文件基础上写 Babel 会查找和自动读取它们,所以以上配置文件只需要存在一个即可

    2. 具体配置

    我们以 babel.config.js 配置文件为例:

    1. module.exports = {
    2. // 预设
    3. presets: [],
    4. };

    1. presets 预设

    简单理解:就是一组 Babel 插件,扩展 Babel 功能

    • @babel/preset-env :一个智能预设,允许您使用最新的JavaScript。
    • @babel/preset-react :一个用来编译 Recat jsx 语法的预设
    • @babel/preset-typescript :一个用来编译 TypeScript 语法的预设

    3. 在 Webpack 中使用

    1. 下载包

    npm i babel-loader @babel/core @babel/preset-env -D

    2. 定义 Babel 配置文件

    • babel.config.js
    1. module.export = {
    2. // 智能预设:能够编译ES6语法
    3. presets: ['@babel/preset-env'],
    4. }

    3. 配置 webpack.config.js 文件

    • webpack.config.js

    在 webpack 配置对象中,需要将 babel-loader 添加到 module 列表中,就像下面这样:

    1. module: {
    2. rules: [
    3. {
    4. test: /\.m?js$/,
    5. exclude: /node_modules/, // 排除node_modules中的js文件(这些文件不处理)
    6. /* use: {
    7. loader: 'babel-loader',
    8. options: {
    9. presets: ['@babel/preset-env']
    10. }
    11. } */
    12. /* loader: 'babel-loader',
    13. options: {
    14. presets: ['@babel/preset-env']
    15. } */
    16. loader: 'babel-loader',
    17. // options也可以写在外面,babel.config.js 里面
    18. }
    19. ]
    20. }

    处理 Html 资源

    1. 下载包

    npm i html-webpack-plugin -D

    2. 配置

    webpack.config.js

    1. const HtmlWebpackPlugin = require('html-webpack-plugin');
    2. const path = require('path');
    3. module.exports = {
    4. entry: 'index.js',
    5. output: {
    6. path: path.resolve(__dirname, './dist'),
    7. filename: 'index_bundle.js',
    8. },
    9. plugins: [
    10. new HtmlWebpackPlugin({
    11. // 模板:以public/index.html 文件创建新的html文件
    12. // 新的html文件特点:1.结构和原来一致 2.自动引入打包输出的资源
    13. template: path.resolve(__dirname, "public/index.html"),
    14. })
    15. ],
    16. };

    开发服务器&自动化

    注意:自动化开发服务器运行后不会自动生成dist文件夹

    1. 下载包

    npm i webpack-dev-server -D

    2. 配置

    • webpack.config.js
    1. const path = require("path"); // nodejs核心模块,专门用来处理路径问题
    2. const ESLintPlugin = require('eslint-webpack-plugin');
    3. const HtmlWebpackPlugin = require('html-webpack-plugin');
    4. module.exports = {
    5. // ......
    6. plugins: [],
    7. // 开发服务器:不会输出资源,在内存中编译打包的
    8. devServer: {
    9. host:"localhost", // 启动服务器域名
    10. port: "3000", // 启动服务器端口号
    11. open: true, // 是否自动打开浏览器
    12. },
    13. mode:"development",
    14. }

    3.运行指令

    npx webpack serve

    生产模式介绍

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

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

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

    1. 优化代码运行性能
    2. 优化代码打包速度

    生产模式准备

    我们分别准备两个配置文件来放不同的配置

    1. 文件目录

    |—— webpack-test(项目根目录)

              |—— config (Webpack配置文件目录)
              |         |—— webpack.dev.js(开发模式配置文件)

              |         |—— webpack.prod.js(开发模式配置文件)

              |—— node_modules (下载包存放目录)

              |—— src(项目源码目录,除了html其他都在src里面)

              |          |——略

              |——public(项目html文件)

              |         |——index.html

              |—— .eslintrc.js (Eslint配置文件)

              |—— babel.config.js (Babel配置文件)

              |—— package.json(包的依赖管理配置文件)

    2. 修改 webpack.dev.js

    1. const path = require("path"); // nodejs核心模块,专门用来处理路径问题
    2. const ESLintPlugin = require('eslint-webpack-plugin');
    3. const HtmlWebpackPlugin = require('html-webpack-plugin');
    4. module.exports = {
    5. entry: './src/main.js',
    6. output: {
    7. // 所有文件的输出路径
    8. // 开发模式没有输出
    9. path: undefined,
    10. // ......
    11. },
    12. module: {
    13. rules: [
    14. {
    15. test: /\.css$/,
    16. use: ["style-loader","css-loader"],
    17. },
    18. {
    19. test: /\.less$/,
    20. use: ['style-loader','css-loader','less-loader'],
    21. },
    22. // .......
    23. ],
    24. },
    25. plugins: [
    26. new ESLintPlugin({
    27. // 检测哪些文件
    28. context: path.resolve(__dirname, "../src")
    29. }),
    30. new HtmlWebpackPlugin({
    31. // 新的html文件特点:1.结构和原来一致 2.自动引入打包输出的资源
    32. template: path.resolve(__dirname, "../public/index.html"),
    33. })
    34. ],
    35. devServer: {
    36. host: "localhost",
    37. port: "3000",
    38. open: true,
    39. },
    40. mode: "development",
    41. }

     3. 开发模式下运行

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

    4. 修改 webpack.prod.js

    1. const path = require("path"); // nodejs核心模块,专门用来处理路径问题
    2. const ESLintPlugin = require('eslint-webpack-plugin');
    3. const HtmlWebpackPlugin = require('html-webpack-plugin');
    4. module.exports = {
    5. entry: './src/main.js',
    6. output: {
    7. // 所有文件的输出路径
    8. // __dirname nodejs的变量,代表当前文件的文件夹目录
    9. path: path.resolve(__dirname, "../dist"), // 绝对路径
    10. // 入口文件打包输出文件名
    11. filename: 'static/js/main.js',
    12. // 自动清空上次打包的内容
    13. // 原理:在打包前,将path整个目录内容清空,再进行打包
    14. clean: true,
    15. },
    16. module: {
    17. rules: [
    18. {
    19. test: /\.css$/,
    20. use: ["style-loader","css-loader"],
    21. },
    22. {
    23. test: /\.less$/,
    24. use: ['style-loader','css-loader','less-loader'],
    25. },
    26. // .......
    27. ],
    28. },
    29. plugins: [
    30. new ESLintPlugin({
    31. // 检测哪些文件
    32. context: path.resolve(__dirname, "../src")
    33. }),
    34. new HtmlWebpackPlugin({
    35. // 新的html文件特点:1.结构和原来一致 2.自动引入打包输出的资源
    36. template: path.resolve(__dirname, "../public/index.html"),
    37. })
    38. ],
    39. mode: "production",
    40. }

     5. 生产模式下运行

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

    优化运行代码

    在package.json里面的script配置

    1. "scripts": {
    2. "start": "npm run dev",
    3. "dev": "webpack serve --config ./config/webpack.dev.js",
    4. "build": "webpack --config ./config/webpack.prod.js"
    5. },

    这样运行开发模式的代码就是:npm start

    这样运行生产模式的代码就是:npm run build

    Css 处理

    提取Css成单独文件

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

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

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

    1. 下载包

    npm i mini-css-extract-plugin -D

    2. 配置

    webpack.prod.js

    1. const MiniCssExtractPlugin = require("mini-css-extract-plugin");
    2. module.exports = {
    3. plugins: [
    4. new MiniCssExtractPlugin({
    5. // 指定文件输出目录
    6. filename: "static/css/main.css"
    7. }),
    8. ],
    9. module: {
    10. rules: [
    11. {
    12. test: /\.css$/i,
    13. use: [MiniCssExtractPlugin.loader, "css-loader"],
    14. },
    15. ],
    16. },
    17. };

    Css 兼容性处理

    1.下载包

    npm i postcss-loader postcss postcss-preset-env -D

    2. 配置

    webpack.prod.js

    在css-loader后面,less-loader前面插入配置代码

    1. module.exports = {
    2. module: {
    3. rules: [
    4. {
    5. test: /\.css$/i,
    6. use: [
    7. 'style-loader',
    8. 'css-loader',
    9. {
    10. loader: 'postcss-loader',
    11. options: {
    12. postcssOptions: {
    13. plugins: [
    14. [
    15. 'postcss-preset-env',
    16. {
    17. // 其他选项
    18. },
    19. ],
    20. ],
    21. },
    22. },
    23. },
    24. ],
    25. },
    26. ],
    27. },
    28. };

    或者使用 PostCSS 本身的 配置文件

    postcss.config.js

    1. module.exports = {
    2. // 你可以指定下面提到的所有选项 https://postcss.org/api/#processoptions
    3. // parser: 'sugarss',
    4. plugins: [
    5. // PostCSS 插件
    6. ['postcss-short', { prefix: 'x' }],
    7. 'postcss-preset-env',
    8. ],
    9. };

    Loader 将会自动搜索配置文件。

    webpack.config.js

    1. module.exports = {
    2. module: {
    3. rules: [
    4. {
    5. test: /\.css$/i,
    6. use: ['style-loader', 'css-loader', 'postcss-loader'],
    7. },
    8. ],
    9. },
    10. };

    最后,通过你喜欢的方式运行 webpack

    3. 控制兼容性

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

    1. {
    2. // 其他省略
    3. "browserslist": ["ie >= 8"]
    4. }

    想要知道更多的 browserslist 配置,查看 browserslist 文档

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

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

    1. {
    2. // 其他省略
    3. " browserslist": ["last 2 version", ">1%", "not dead"]
    4. }

    4. 合并配置

    由于代码复用率较高,我们可以封装处理样式的函数

    1. const path = require("path"); // nodejs核心模块,专门用来处理路径问题
    2. const ESLintPlugin = require('eslint-webpack-plugin');
    3. const HtmlWebpackPlugin = require('html-webpack-plugin');
    4. const MiniCssExtractPlugin = require("mini-css-extract-plugin");
    5. // 用来获取处理样式的loader
    6. function getStyleLoader(pre) {
    7. return [
    8. MiniCssExtractPlugin.loader, // 将js中css通过创建style标签添加html文件中生效
    9. "css-loader", // 将css资源编译成 commonjs 的模块到js中
    10. 'postcss-loader',
    11. pre,
    12. ].filter(Boolean);
    13. }
    14. module.exports = {
    15. // 入口
    16. entry: './src/main.js', // 相对路径
    17. // 输出
    18. output: {
    19. // 所有文件的输出路径
    20. // __dirname nodejs的变量,代表当前文件的文件夹目录
    21. path: path.resolve(__dirname, "../dist"), // 绝对路径
    22. // 入口文件打包输出文件名
    23. filename: 'static/js/main.js',
    24. // 自动清空上次打包的内容
    25. // 原理:在打包前,将path整个目录内容清空,再进行打包
    26. clean: true,
    27. },
    28. // 加载器
    29. module: {
    30. rules: [
    31. // loader的配置
    32. {
    33. test: /\.css$/, // 只检测 .css文件
    34. use: getStyleLoader(),
    35. },
    36. {
    37. test: /\.less$/,
    38. // loader:'xxx', // 只能使用1个loader
    39. use: getStyleLoader('less-loader'),
    40. },
    41. {
    42. test: /\.s[ac]ss$/,
    43. use: getStyleLoader('sass-loader'),
    44. },
    45. {
    46. test: /\.styl$/,
    47. use: getStyleLoader('stylus-loader'),
    48. },
    49. {
    50. test: /\.(png|jpe?g|gif|webp|svg)$/,
    51. type: 'asset',
    52. generator: {
    53. // [hash:10] 代表hash值只取前10位
    54. filename: 'static/images/[hash:10][ext][query]'
    55. }
    56. },
    57. /* {
    58. test: /\.(png|jpe?g|gif|webp|svg)$/,
    59. type: 'asset',
    60. parser: {
    61. dataUrlCondition: {
    62. // 小于10kb 的图片转base64
    63. // 优点:减少请求数量 缺点:体积会更大
    64. maxSize: 4 * 1024 // 4kb
    65. }
    66. }
    67. } */
    68. {
    69. test: /\.(ttf|woff2?|map3|map4|avi)$/,
    70. type: 'asset/resource',
    71. generator: {
    72. // 输出名称
    73. filename: 'static/media/[hash:10][ext][query]'
    74. }
    75. },
    76. {
    77. test: /\.m?js$/,
    78. exclude: /node_modules/, // 排除node_modules中的js文件(这些文件不处理)
    79. /* use: {
    80. loader: 'babel-loader',
    81. options: {
    82. presets: ['@babel/preset-env']
    83. }
    84. } */
    85. /* loader: 'babel-loader',
    86. options: {
    87. presets: ['@babel/preset-env']
    88. } */
    89. loader: 'babel-loader',
    90. // options也可以写在外面
    91. },
    92. ],
    93. },
    94. // 插件
    95. plugins: [
    96. // plugin的配置
    97. new ESLintPlugin({
    98. // 检测哪些文件
    99. context: path.resolve(__dirname, "../src")
    100. }),
    101. new HtmlWebpackPlugin({
    102. // 模板:以public/index.html 文件创建新的html文件
    103. // 新的html文件特点:1.结构和原来一致 2.自动引入打包输出的资源
    104. template: path.resolve(__dirname, "../public/index.html"),
    105. }),
    106. new MiniCssExtractPlugin({
    107. // 指定文件输出目录
    108. filename: "static/css/main.css"
    109. }),
    110. ],
    111. // 模式
    112. // mode: "development",
    113. mode: "production",
    114. }

     Css压缩

    1. 下载包

    npm i css-minimizer-webpack-plugin -D

    2.  配置

    • webpack.prod.js
    1. const MiniCssExtractPlugin = require("mini-css-extract-plugin");
    2. const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");
    3. module.exports = {
    4. module: {
    5. rules: [
    6. {
    7. test: /.s?css$/,
    8. use: [MiniCssExtractPlugin.loader, "css-loader", "sass-loader"],
    9. },
    10. ],
    11. },
    12. optimization: {
    13. minimizer: [
    14. // 在 webpack@5 中,你可以使用 `...` 语法来扩展现有的 minimizer(即 `terser-webpack-plugin`),将下一行取消注释
    15. // `...`,
    16. new CssMinimizerPlugin(),
    17. ],
    18. },
    19. plugins: [new MiniCssExtractPlugin()],
    20. };

    html压缩

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

    不需要额外进行配置

  • 相关阅读:
    分治算法(divide and conquer)
    sqli第24关二次注入
    父相子绝 巧用auto
    GBase 8c PGXC_CLASS系统表
    sed使用技巧-在replacement块获取pattern匹配的值
    vue3使用v-model控制子组件进行双向数据绑定
    vue安装依赖出现npm ERR! code ERESOLVE npm ERR! ERESOLVE could not resolve错误解决方法
    SpringCloud学习笔记-注册微服务到Eureka注册中心
    宏观经济学复习
    《LKD3粗读笔记》(11)定时器和时间管理
  • 原文地址:https://blog.csdn.net/DIUDIUjiang/article/details/127388827