webpack.config.js 是 webpack 的配置文件。
作用: 指示 webpack 干哪些活(当你运行 webpack 指令时,会加载里面的配置)
所有构建工具都是基于 nodejs 平台运行的,模块化默认采用 commonjs。

开发环境配置(总)

开发环境配置主要是为了能让代码运行。主要考虑以下几个方面:

  • 打包样式资源 npm i css-loader style-loader less-loader less -D
  • 打包 html 资源 npm install --save-dev html-webpack-plugin
  • 打包图片资源 npm install --save-dev html-loader@0.5.5 url-loader file-loader
    • webpack5.0可以使用内置的 Asset Modules,css文件像 background 和 icon 这样的图像无需**url-loader file-loader**
    • webpack5.0 依然需要html-loader解析html中img
  • 打包其他资源 npm install --save-dev file-loader
    • webpack5.0使用 Asset Modules 可以加载任何类型的文件,也包括字体。 test: /.( woff | woff2 | eot | ttf | otf )$/i
  • 开发服务器 devServer:用来自动化,不用每次修改后都重新输入webpack打包一遍(自动编译,自动打开浏览器,自动刷新浏览器): npm install webpack-dev-server -D
    • 注意事项
      • 先执行webpack打包生成代码到dist 否则会报错,因为server指定文件时dist
      • 因为是本地运行没有全局安装 所以要使用npx,而webpack 是全局安装所以webpack即可
      • 出现下图错误时因为npx时 全局的webpack找不到 devServer,所有要本地安装一下webpack和webpack-cli,再执行npx…
      • image.png
      • 4.0运行 npx webpack-dev-server
      • 5.0运行 npx webpack serve或4.0那个都可以 加—open打开浏览器

下面是一个简单的开发环境webpack.confg.js配置文件

  1. /*
  2. webpack.config.js webpack的配置文件
  3. 作用: 指示 webpack 干哪些活(当你运行 webpack 指令时,会加载里面的配置)
  4. 所有构建工具都是基于nodejs平台运行的~模块化默认采用commonjs。
  5. */
  6. // resolve用来拼接绝对路径的方法
  7. const { resolve } = require('path');
  8. const HtmlWebpackPlugin = require('html-webpack-plugin');
  9. module.exports = {
  10. // webpack配置
  11. // 入口起点
  12. entry: './src/index.js',
  13. // 输出
  14. output: {
  15. // 输出文件名
  16. filename: 'built.js',
  17. // 输出路径
  18. // __dirname nodejs的变量,代表当前文件的目录绝对路径
  19. path: resolve(__dirname, 'build')
  20. },
  21. // loader的配置
  22. module: {
  23. rules: [
  24. // 详细loader配置
  25. // 不同文件必须配置不同loader处理
  26. {
  27. // 匹配哪些文件
  28. test: /\.css$/,
  29. // 使用哪些loader进行处理
  30. use: [
  31. // use数组中loader执行顺序:从右到左,从下到上 依次执行
  32. // 创建style标签,将js中的样式资源插入进行,添加到head中生效
  33. //后边提取css文件会去掉这个loader
  34. 'style-loader',
  35. // 将css文件变成commonjs模块加载js中,里面内容是样式字符串
  36. 'css-loader'
  37. ]
  38. },
  39. {
  40. test: /\.s[ac]ss$/i,
  41. use: [
  42. // 将 JS 字符串生成为 style 节点
  43. 'style-loader',
  44. // 将 CSS 转化成 CommonJS 模块
  45. 'css-loader',
  46. // 将 Sass 编译成 CSS
  47. 'sass-loader',
  48. ],
  49. },
  50. {
  51. // url-loader:处理图片资源,问题:默认处理不了html中的img图片
  52. test: /\.(jpg|png|gif)$/,
  53. // 需要下载 url-loader file-loader
  54. loader: 'url-loader',
  55. options: {
  56. // 图片大小小于8kb,就会被base64处理,优点:减少请求数量(减轻服务器压力),缺点:图片体积会更大(文件请求速度更慢)
  57. // base64在客户端本地解码所以会减少服务器压力,如果图片过大还采用base64编码会导致cpu调用率上升,网页加载时变卡
  58. limit: 8 * 1024,
  59. // 给图片重命名,[hash:10]:取图片的hash的前10位,[ext]:取文件原来扩展名
  60. name: '[name].[hash:10].[ext]',
  61. // 问题:因为url-loader默认使用es6模块化解析,而html-loader引入图片是conmonjs,解析时会出问题:[object Module]
  62. // 解决:关闭url-loader的es6模块化,使用commonjs解析
  63. esModule: false,
  64. //指定打包路径
  65. outputPath: 'imgs',
  66. },
  67. },
  68. {
  69. test: /\.html$/,
  70. //@0.5.5 否则图片打不开
  71. // 处理html文件的img图片(负责引入img,从而能被url-loader进行处理)
  72. loader: 'html-loader',
  73. },
  74. {
  75. // 排除html|js|css|less|jpg|png|gif文件
  76. exclude: /\.(html|js|css|scss|jpg|png|gif)$/,
  77. // file-loader:处理其他文件
  78. loader: 'file-loader',
  79. options: {
  80. name: '[hash:10].[ext]',
  81. outputPath: 'media',
  82. },
  83. }
  84. ]
  85. },
  86. // plugins的配置
  87. plugins: [
  88. // plugins的配置
  89. // html-webpack-plugin
  90. // 功能:默认会创建一个空的HTML,自动引入打包输出的所有资源(JS/CSS)
  91. // 需求:需要有结构的HTML文件
  92. new HtmlWebpackPlugin({
  93. // 复制 './src/index.html' 文件,并自动引入打包输出的所有资源(JS/CSS)
  94. template: './src/index.html',
  95. filename:'app.html'
  96. //script标签放置的位置
  97. inject:'body'
  98. })
  99. ],
  100. // 模式
  101. mode: 'development', // 开发模式
  102. // mode: 'production',
  103. // 开发服务器 devServer:用来自动化,不用每次修改后都重新输入webpack打包一遍(自动编译,自动打开浏览器,自动刷新浏览器)
  104. // 特点:只会在内存中编译打包,不会有任何输出(不会像之前那样在外面看到打包输出的build包,而是在内存中,关闭后会自动删除)
  105. // 启动devServer指令为:npx webpack-dev-server
  106. devServer: {
  107. // 项目构建后路径
  108. //contentBase: resolve(__dirname, 'build'),//4.0
  109. static: resolve(__dirname, 'build'),//5.0
  110. // 启动gzip压缩
  111. compress: true,
  112. // 端口号
  113. port: 3000,
  114. // 自动打开浏览器
  115. open: true,
  116. },
  117. }

其中,大部分配置都在注释中给出解释。

  • 运行项目的两个指令:
    webpack 会将打包结果输出出去(build文件夹)
    npx webpack-dev-server 只会在内存中编译打包,没有输出
  • loader 和 plugin 的不同:(plugin 一定要先引入才能使用)loader:1. 下载 2. 使用(配置 loader)plugins:1.下载 2. 引入 3. 使用

image.png

资源模块

资源模块(asset module)是一种模块类型,它允许我们应用Webpack来打包其他资 源文件(如字体,图标等)
资源模块类型(asset module type),通过添加 4 种新的模块类型,来替换所有这些 loader:

  • asset/resource 发送一个单独的文件并导出 URL。
  • asset/inline 导出一个资源的 data URI。
  • asset/source 导出资源的源代码。
  • asset在导出一个 data URI 和发送一个单独的文件之间自动选择。

    resource 资源

    ```javascript module: { rules: [{ test: /.png/, type: ‘asset/resource’ }] },
  1. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/1624878/1637902321088-fb7c2842-f267-486b-b6b7-4220c7e147f7.png#clientId=ubcd77f94-c9dc-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=134&id=u1460e615&margin=%5Bobject%20Object%5D&name=image.png&originHeight=267&originWidth=478&originalType=binary&ratio=1&rotation=0&showTitle=false&size=45008&status=done&style=none&taskId=u6dbce0a8-2e62-4f4b-9651-ef04166b2a9&title=&width=239)
  2. <a name="e3bUe"></a>
  3. #### 自定义输出文件名
  4. 默认情况下, asset/resource 模块以 [contenthash][ext][query] 文件名 发送到输出目录。
  5. ```javascript
  6. output: {
  7. assetModuleFilename: 'images/[contenthash][ext][query]'
  8. },

另一种自定义输出文件名的方式是,将某些资源发送到指定目录,修改配置:

  1. rules: [{
  2. test: /\.png/,
  3. type: 'asset/resource',
  4. // 优先级高于 assetModuleFilename
  5. generator: {
  6. filename: 'images/[contenthash][ext][query]'
  7. }
  8. }]

inline 资源

  1. module: {
  2. rules:[
  3. {
  4. test: /\.svg/,
  5. type: 'asset/inline'
  6. }
  7. ],
  8. }

启动服务
image.png

自定义 data URI 生成器

webpack 输出的 data URI,默认是呈现为使用 Base64 算法编码的文件内容。 如果要使用自定义编码算法,则可以指定一个自定义函数来编码文件内容。
npm install mini-svg-data-uri -D

  1. const svgToMiniDataURI = require('mini-svg-data-uri')
  2. rules: [
  3. {
  4. test: /\.svg/,
  5. type: 'asset/inline',
  6. generator: {
  7. dataUrl: content => {
  8. content = content.toString();
  9. return svgToMiniDataURI(content);
  10. }
  11. }
  12. }
  13. ]

image.png

source 资源

source资源,导出资源的源代码。

  1. module: {
  2. rules: [
  3. test: /\.txt/,
  4. type: 'asset/source'
  5. ]
  6. }

所有 .txt 文件将原样注入到 bundle 中。

asset 通用资源类型

通用资源类型 asset , 在导出一个 data URI 和发送一个单独的文件之间自动选择

  1. module: {
  2. rules: [
  3. test: /\.jpg/,
  4. type: 'asset'
  5. ]
  6. }

现在,webpack 将按照默认条件,自动地在 resource 和 inline 之间进行选择: 小于 8kb 的文件,将会视为 inline 模块类型,否则会被视为 resource 模块类型。

  1. rules: [
  2. {
  3. test: /\.jpg/,
  4. type: 'asset',
  5. parser: {
  6. //修改默认8kb 为4kb
  7. dataUrlCondition: {
  8. maxSize: 4 * 1024 // 4kb
  9. }
  10. }
  11. }
  12. ]

image.png