webpack是一个现代JavaScript应用程序的静态模块打包器。当webpack处理应用程序时,它会递归地构建一个依赖关系图,其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个bundle.
本文着重讲述webpack基础,先来绘制一个大概的知识体系,接下来会根据该知识体系进行讲述:
webpack基础 - 图1

1. 简单配置

第一部分,我们先从“会配置”入手,去了解webpack简单配置以及简单配置所涉及到的知识点。该部分重点需要掌握以下几点: :::info 1、webpack的常规配置项;
2、常用的Loader与其配置;
3、常用的Plugin与其配置;
4、Babel的配置与使用; :::

1.1 安装

在本地安装webpack以及webpack-cli

  1. npm install webpack webpack-cli -D // 注意区分环境 -D -S

1.2 工作模式

webpack在4之后就支持0配置打包。我们在此处新建一个./src/index.js文件,简单测试一下:

  1. const a = 'btqf';
  2. console.log('btqf');
  3. module.exports = a

当我们直接运行npx webpack,启动打包,会出现以下结果:image.png
此时提示我们没有配置模式(mode),我们都知道mode的作用是告知webpack使用相应模式的内置优化,其默认值为production。

选项 描述
development 开发模式,打包更为快速,节省代码优化步骤
production 生产模式,打包较慢,会开启tree-shaking 和压缩代码
none 不使用任何默认的优化选项

因此对于上面的警告提示,我们可以采用以下两种方法:

  • 在配置中提供mode选项

    1. module.exports = {
    2. mode: 'production'
    3. };
  • 从cli参数中传递:

    1. webpack --mode=production

    1.3 配置文件

    虽然有0配置打包,但是在实际工作中。我们很多时候采用配置文件的方式来满足不同项目的需求,基本的配置步骤如下:

  • 根路径下新建一个配置文件webpack.config.js

  • 新增基本配置信息 ```javascript const path = require(‘path’)

module.exports = { mode: ‘production’, // 模式 entry: ‘./src/index.js’, // 打包入口地址 output: { filename: ‘bundle.js’, // 输出文件名 path: path.join(__dirname, ‘dist’) // 输出文件目录 } }

  1. <a name="uAPKu"></a>
  2. ### 1.4 Loader
  3. 首先我们需要了解,**webpack默认支持处理 JS 和 JSON 文件,无法处理其他类型的文件,所以这里我们可以使用Loader来将webpack不认识的内容转化为认识的内容。**<br />我们先创建`./src/main.css`文件,在把**打包入口修改为**`./src/main.css`后直接运行`npx webpack`.
  4. ```javascript
  5. // ./src/main.css
  6. body {
  7. margin: 10px auto;
  8. background: cyan;
  9. max-width: 800px;
  10. font-size: 46px;
  11. font-weight: 600;
  12. color: white;
  13. position: fixed;
  14. left: 50%;
  15. transform: translateX(-50%);
  16. }
  1. 此时我们来看看运行结果:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/28976061/1659770836342-fa313525-4156-48fa-a8a9-77678c7a46ce.png#clientId=ue5f6de47-6c08-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=132&id=uf0141290&margin=%5Bobject%20Object%5D&name=image.png&originHeight=165&originWidth=1475&originalType=binary&ratio=1&rotation=0&showTitle=false&size=23792&status=done&style=none&taskId=u112409e5-df51-46f5-8123-0750a1afeed&title=&width=1180)<br />如我们所料一般,根据提示我们需要安装`css-loader`来对 css 文件进行处理:
  1. npm install css-loader -D
  1. 在安装过后,我们需要在`webpack.config.js`中配置资源加载模块:
  1. const path = require('path')
  2. module.exports = {
  3. mode: 'development', // 模式
  4. entry: './src/main.css', // 打包入口地址
  5. output: {
  6. filename: 'bundle.css', // 输出文件名
  7. path: path.join(__dirname, 'dist') // 输出文件目录
  8. },
  9. module: {
  10. rules: [ // 转换规则
  11. {
  12. test: /\.css$/, //匹配所有的 css 文件
  13. use: 'css-loader' // use: 对应的 Loader 名称
  14. }
  15. ]
  16. }
  17. }
  1. 在修改过后就可以成功打包了:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/28976061/1659771384029-f02a5b6a-9f9c-4ee7-a35c-ac7a039a5b31.png#clientId=ue5f6de47-6c08-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=111&id=u6b344b64&margin=%5Bobject%20Object%5D&name=image.png&originHeight=139&originWidth=1115&originalType=binary&ratio=1&rotation=0&showTitle=false&size=29580&status=done&style=none&taskId=u2293f109-ea41-4d41-a10f-9692cbe55d8&title=&width=892)

1.5 Plugins(插件)

与 Loader 用于转换特定类型的文件不同,插件可以贯穿webpack打包的生命周期,执行不同的任务。
如果想要使用一个插件,我们只需要require()它,探后把它添加到plugins数组中,多事插件可以通过选项(option)自定义。这么说可能不太清楚,下面用一个例子来详细讲述:
第一步,我们新建一个./src/index.html文件:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>ITEM</title>
  8. </head>
  9. <body>
  10. </body>
  11. </html>
  1. 如果我们想要打包后的资源文件,例如 js 或者 css 文件可以自动引入到 html 文件中,就需要使用插件 `html-webpack-plugin`来帮助完成该操作。所以第二步为安装插件:
  1. npm install html-webpack-plugin -D
  1. 第三步就是在`webpack.config.js`中配置插件即可:
  1. const path = require('path')
  2. const HtmlWebpackPlugin = require('html-webpack-plugin')
  3. module.exports = {
  4. mode: 'development', // 模式
  5. entry: './src/index.js', // 打包入口地址
  6. output: {
  7. filename: 'bundle.js', // 输出文件名
  8. path: path.join(__dirname, 'dist') // 输出文件目录
  9. },
  10. module: {
  11. rules: [
  12. {
  13. test: /\.css$/, //匹配所有的 css 文件
  14. use: 'css-loader' // use: 对应的 Loader 名称
  15. }
  16. ]
  17. },
  18. plugins:[ // 配置插件
  19. new HtmlWebpackPlugin({
  20. template: './src/index.html'
  21. })
  22. ]
  23. }
  1. 当我们运行后,打开`./dist/index.html`文件,可以看到它自动引入的打包好的`bundle.js`,非常方便:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/28976061/1659772249255-e754ddde-7d33-4fc3-8272-3ee7718d8713.png#clientId=ue5f6de47-6c08-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=250&id=u7b9873fc&margin=%5Bobject%20Object%5D&name=image.png&originHeight=313&originWidth=1091&originalType=binary&ratio=1&rotation=0&showTitle=false&size=29985&status=done&style=none&taskId=u7f79d8f1-de8e-45d4-a84a-a725536e010&title=&width=872.8)

1.6 自动清空打包目录

在每次进行打包的时候,打包目录总是会遗留上次打包的文件,为了保持打包目录的纯净,我们需要在打包前将打包目录清空。这里我们可以使用插件clean-webpack-plugin来实现。
1.安装

  1. npm install clean-webpack-plugin -D
  1. 2.配置
  1. const path = require('path')
  2. const HtmlWebpackPlugin = require('html-webpack-plugin')
  3. // 引入插件
  4. const { CleanWebpackPlugin } = require('clean-webpack-plugin')
  5. module.exports = {
  6. // ...
  7. plugins:[ // 配置插件
  8. new HtmlWebpackPlugin({
  9. template: './src/index.html'
  10. }),
  11. new CleanWebpackPlugin() // 引入插件
  12. ]
  13. }

1.7 区分环境

我们都清楚,本地开发和部署线上,肯定有不同的需求。
本地环境

  • 需要更快的构件速度
  • 需要打印 debug 信息
  • 需要 live reload 或 hot reload 功能
  • 需要 sourceMap 方便定位问题

生产环境

  • 需要更小的包体积、代码压缩+tree-shaking
  • 需要进行代码分割
  • 需要压缩图片体积
  • …..

针对不同的需求,我们得要做好环境的区分。

  1. 本地安装 cross-env

    1. npm install cross-env -D
  2. 配置启动命令,打开./package.json

    1. "scripts": {
    2. "dev": "cross-env NODE_ENV=dev webpack serve --mode development",
    3. "test": "cross-env NODE_ENV=test webpack --mode production",
    4. "build": "cross-env NODE_ENV=prod webpack --mode production"
    5. },
  3. 在webpack配置文件中获取环境变量 ```javascript const path = require(‘path’) const HtmlWebpackPlugin = require(‘html-webpack-plugin’)

console.log(‘process.env.NODE_ENV=’, process.env.NODE_ENV) // 打印环境变量

const config = { entry: ‘./src/index.js’, // 打包入口地址 output: { filename: ‘bundle.js’, // 输出文件名 path: path.join(__dirname, ‘dist’) // 输出文件目录 }, module: { rules: [ { test: /.css$/, //匹配所有的 css 文件 use: ‘css-loader’ // use: 对应的 Loader 名称 } ] }, plugins:[ // 配置插件 new HtmlWebpackPlugin({ template: ‘./src/index.html’ }) ] }

module.exports = (env, argv) => { console.log(‘argv.mode=’,argv.mode) // 打印 mode(模式) 值 // 这里可以通过不同的模式修改 config 配置 return config; }

  1. 4. 测试执行
  2. ```javascript
  3. // 执行 npm run build
  4. process.env.NODE_ENV= prod
  5. argv.mode= production
  6. // 执行 npm run test
  7. process.env.NODE_ENV= test
  8. argv.mode= production
  9. // 执行 npm run dev
  10. process.env.NODE_ENV= dev
  11. argv.mode= development

1.8 启动 devServer

1.安装 webpack-dev-server

  1. npm intall webpack-dev-server@3.11.2 -D
  2. // 注意:当devServer版本 >= 4.0.0 时,需要使用devServer.static进行配置,不再有
  3. // devServer.contentBase 配置项

2.配置本地服务

  1. // webpack.config.js
  2. const config = {
  3. // ...
  4. devServer: {
  5. contentBase: path.resolve(__dirname, 'public'), // 静态文件目录
  6. compress: true, //是否启动压缩 gzip
  7. port: 8080, // 端口号
  8. // open:true // 是否自动打开浏览器
  9. },
  10. // ...
  11. }
  12. module.exports = (env, argv) => {
  13. console.log('argv.mode=',argv.mode) // 打印 mode(模式) 值
  14. // 这里可以通过不同的模式修改 config 配置
  15. return config;
  16. }
  1. 在这里先说明一下,**为什么要配置 contentBase?**<br />原因在于webpack在进行打包的时候,对静态文件的处理,例如图片,都是直接copy到dist目录下,但对于本地开发来说,该过程费时也没有必要,所以在设置contentBase之后,就直接到对应的静态目录下面去读取文件,而不需要对文件进行任何改动,**节省了时间和性能开销。**<br />3.启动本地服务`npm run dev`,打开`http://localhost:8080/`即可看到效果

1.9 引入CSS

在上面的Loader中,我们通过使用css-Loader来处理css,但是单靠css-Loader是没有办法将样式加载到页面上的,此时我们可以再安装一个style-loader来完成。
style-loader就是将处理好的css通过style标签的形式添加到页面上。值得注意的是,loader的执行顺序是固定从后往前的。
1.安装

  1. npm install style-loader -D
  1. 2.配置
  1. const config = {
  2. // ...
  3. module: {
  4. rules: [
  5. {
  6. test: /\.css$/, //匹配所有的 css 文件
  7. use: ['style-loader','css-loader']
  8. }
  9. ]
  10. },
  11. // ...
  12. }
  1. 3.引入样式文件:在入口文件`./src/index.js`中引入样式文件`./src/main.css`
  1. // ./src/index.js
  2. import './main.css';
  3. const a = 'Hello ITEM'
  4. console.log(a)
  5. module.exports = a;
  1. 4.重启本地服务,访问`http://localhost:8080/`<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/28976061/1659855462545-39483908-4bb7-49f1-abbe-d1b4900cb89a.png#clientId=u2d87e882-4af5-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=347&id=u2ad42f8e&margin=%5Bobject%20Object%5D&name=image.png&originHeight=434&originWidth=932&originalType=binary&ratio=1&rotation=0&showTitle=false&size=35859&status=done&style=none&taskId=ud22c5397-8a4a-401c-a5de-1040eaeb772&title=&width=745.6)

1.10 CSS兼容性

我们可以通过使用postcss-loader,自动添加 css3 部分属性的浏览器前缀。
就像之前用到的transform: translateX(-50%),需要加上不同的浏览器前缀。
1.安装postcss-loader

  1. npm install postcss postcss-loader postcss-preset-env -D

2.在webpack.config.js文件中添加postcss-loader
3.创建postcss配置文件postcss.config.js

  1. // postcss.config.js
  2. module.exports = {
  3. plugins: [require('postcss-preset-env')]
  4. }

4.创建 postcss-preset-env 配置文件 .browserslistrc

  1. # 换行相当于 and
  2. last 2 versions # 回退两个浏览器版本
  3. > 0.5% # 全球超过0.5%人使用的浏览器,可以通过 caniuse.com 查看不同浏览器不同版本占有率
  4. IE 10 # 兼容IE 10

5.尝试运行,前缀自动加上。
image.png

1.11 引入Less或者Sass

less 和 sass 文件都是webpack无法识别的,需要对应的 loader 来处理。

文件类型 loader
Less less-loader
Sass sass-loader node-sass或dart-sass

1.安装

  1. npm install sass-loader -D
  2. // 推荐用淘宝镜像下载,成功率比较高
  3. npm i node-sass --sass_binary_site=https://npm.taobao.org/mirrors/node-sass/
  1. 2.新建`./src/sass.scss`
  1. $color: rgb(190, 23, 168);
  2. body {
  3. p {
  4. background-color: $color;
  5. width: 300px;
  6. height: 300px;
  7. display: block;
  8. text-align: center;
  9. line-height: 300px;
  10. }
  11. }
  1. 3.在入口文件中引入Sass文件后,修改webpack.config.js配置
  1. const config = {
  2. // ...
  3. rules: [
  4. {
  5. test: /\.(s[ac]|c)ss$/i, //匹配所有的 sass/scss/css 文件
  6. use: [
  7. 'style-loader',
  8. 'css-loader',
  9. 'postcss-loader',
  10. 'sass-loader',
  11. ]
  12. },
  13. ]
  14. },
  15. // ...
  16. }

1.12 分离样式文件

在前面我们通过style-loader将样式通过style标签的形式添加到页面上,但是我们可以通过mini-css-extract-plugin将css文件的形式引入到页面上。
1.安装

  1. npm install mini-css-extract-plugin -D
  1. 2.修改配置
  1. // ...
  2. // 引入插件
  3. const MiniCssExtractPlugin = require('mini-css-extract-plugin')
  4. const config = {
  5. // ...
  6. module: {
  7. rules: [
  8. // ...
  9. {
  10. test: /\.(s[ac]|c)ss$/i, //匹配所有的 sass/scss/css 文件
  11. use: [
  12. // 'style-loader',
  13. MiniCssExtractPlugin.loader, // 添加 loader
  14. 'css-loader',
  15. 'postcss-loader',
  16. 'sass-loader',
  17. ]
  18. },
  19. ]
  20. },
  21. // ...
  22. plugins:[ // 配置插件
  23. // ...
  24. new MiniCssExtractPlugin({ // 添加插件
  25. filename: '[name].[hash:8].css'
  26. }),
  27. // ...
  28. ]
  29. }
  1. 3.查看打包结果<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/28976061/1659858692503-b4d71ef5-fa87-4834-9690-e0b98ffd1225.png#clientId=u9fc43456-4740-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=333&id=u70b369a2&margin=%5Bobject%20Object%5D&name=image.png&originHeight=416&originWidth=928&originalType=binary&ratio=1&rotation=0&showTitle=false&size=30868&status=done&style=none&taskId=u0dcc0d7b-afca-4637-b3ba-946fc2ff6c9&title=&width=742.4)

1.13 图片和字体文件

在开发环境中,我们可以通过设置contentBase直接读取图片类的静态文件。但是当在生产环境中无法识别图片文件,所以可以用下面集中loader进行处理:

Loader 说明
file-loader 解决图片引入问题,并将图片 copy 到指定目录,默认为 dist
url-loader

| 解依赖 file-loader,当图片小于 limit 值的时候,会将图片转为 base64 编码,大于 limit 值的时候依然是使用 file-loader 进行拷贝 | | img-loader | 压缩图片 |

  1. 1.安装file-loader。<br />值得一提的是,在webpack5中,内置了资源处理模块,`file-loader`和`url-loader`都可以不用安装。
  1. npm install file-loader -D

2.修改配置

  1. const config = {
  2. //...
  3. module: {
  4. rules: [
  5. {
  6. // ...
  7. },
  8. {
  9. test: /\.(jpe?g|png|gif)$/i, // 匹配图片文件
  10. use:[
  11. 'file-loader' // 使用 file-loader
  12. ]
  13. }
  14. ]
  15. },
  16. // ...
  17. }

3.引入图片

  1. <!-- ./src/index.html -->
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. ...
  5. <body>
  6. <p></p>
  7. <div id="imgBox"></div>
  8. </body>
  9. </html>
  10. /* ./src/main.css */
  11. ...
  12. #imgBox {
  13. height: 400px;
  14. width: 400px;
  15. background: url('../public/logo.png');
  16. background-size: contain;
  17. }

4.刷新运行,结果如下:
image.png
至于url-loader的配置基本与上述无异,只是多了一个 limit 的限制,这里就不再详细叙述了。

1.14 资源模块的使用

webpack5 新增资源模块,允许使用资源文件而不用配置额外的loader。资源模块支持以下四个配置: :::info

  • asset/resource 将资源分割为单独的文件,并导出 url,类似之前的 file-loader 的功能.
  • asset/inline 将资源导出为 dataUrl 的形式,类似之前的 url-loader 的小于 limit 参数时功能.
  • asset/source 将资源导出为源码(source code). 类似的 raw-loader 功能.
  • asset 会根据文件大小来选择使用哪种类型,当文件小于 8 KB(默认) 的时候会使用 asset/inline,否则会使用 asset/resource ::: 修改配置,执行打包后的结果一致。 ```javascript // ./src/index.js

const config = { // … module: { rules: [ // … { test: /.(jpe?g|png|gif)$/i, type: ‘asset’, generator: { // 输出文件位置以及文件名 // [ext] 自带 “.” 这个与 url-loader 配置不同 filename: “[name][hash:8][ext]” }, parser: { dataUrlCondition: { maxSize: 50 1024 //超过50kb不转 base64 } } }, { test: /.(woff2?|eot|ttf|otf)(\?.)?$/i, type: ‘asset’, generator: { // 输出文件位置以及文件名 filename: “[name][hash:8][ext]” }, parser: { dataUrlCondition: { maxSize: 10 * 1024 // 超过100kb不转 base64 } } }, ] }, // … }

  1. <a name="iEr1a"></a>
  2. ### 1.15 JS兼容性(Babel)
  3. 在开发中,如果我们想要使用最新的 JS 特性,但有些新特性的兼容性支持并不是很好,所以我们需要做兼容处理,常见的就是将ES6语法转化为ES5。<br />1.在配置前,我们可以先写一点ES6语法。
  4. ```javascript
  5. import './main.css'
  6. class Author {
  7. name = 'btqf'
  8. age = 18
  9. email = 'xxx@outlook.com'
  10. info = () => {
  11. return {
  12. name: this.name,
  13. age: this.age,
  14. email: this.email
  15. }
  16. }
  17. }
  18. module.exports = Author

为了方便看源码,我们先将mode设置为none,以最原始的形式打包。打包后发现代码变化不大,只是对图片的地址进行了替换,接下来我们看看配置babel后的打包结果有啥子变化。

2.安装依赖

  1. npm install babel-loader @babel/core @babel/preset-env -D
  • babel-loader 使用 Babel 加载 ES2015+ 代码并将其转换为 ES5
  • @babel/core Babel 编译的核心包
  • @babel/preset-env Babel 编译的预设,可以理解为 Babel 插件的超集

3.为了避免webpack.config.js过于臃肿,新建文件.babelrc.js配置Babel预设,

  1. // ./babelrc.js
  2. module.exports = {
  3. presets: [
  4. [
  5. "@babel/preset-env",
  6. {
  7. // useBuiltIns: false 默认值,无视浏览器兼容配置,引入所有 polyfill
  8. // useBuiltIns: entry 根据配置的浏览器兼容,引入浏览器不兼容的 polyfill
  9. // useBuiltIns: usage 会根据配置的浏览器兼容,以及你代码中用到的 API 来进行 polyfill,实现了按需添加
  10. useBuiltIns: "entry",
  11. corejs: "3.9.1", // 是 core-js 版本号
  12. targets: {
  13. chrome: "58",
  14. ie: "11",
  15. },
  16. },
  17. ],
  18. ],
  19. };

配置执行打包,发现ES6 class写法已经转换成 ES5 的构造函数形式。
image.png

4.对于还未进入 ECMA 规范中的新特性, Babel 是无法进行处理的,必须要安装对应的插件,例如:

  • @babel/plugin-proposal-decorators
  • @babel/plugin-proposal-class-properties

安装后打开.babelrc.js加上插件的配置

  1. module.exports = {
  2. presets: [
  3. [
  4. "@babel/preset-env",
  5. {
  6. useBuiltIns: "entry",
  7. corejs: "3.9.1",
  8. targets: {
  9. chrome: "58",
  10. ie: "11",
  11. },
  12. },
  13. ],
  14. ],
  15. plugins: [
  16. ["@babel/plugin-proposal-decorators", { legacy: true }],
  17. ["@babel/plugin-proposal-class-properties", { loose: true }],
  18. ]
  19. };

这样就可以打包了,在bundle.js中已经转化为浏览器支持的JS代码。

2.SourceMap配置选择

SourceMap 是一种映射关系,当项目运行后,如果出现错误,我们可以利用 SourceMap 反向定位到源码位置。

2.1 devtool 配置

  1. const config = {
  2. entry: './src/index.js', // 打包入口地址
  3. output: {
  4. filename: 'bundle.js', // 输出文件名
  5. path: path.join(__dirname, 'dist'), // 输出文件目录
  6. },
  7. devtool: 'source-map',
  8. module: {
  9. // ...
  10. }

执行打包后,dist 目录下会生成以 .map 结尾的 SourceMap 文件。除了 source-map 这种类型之外,还有很多种类型可以用,例如:

  • eval
  • eval-source-map
  • cheap-source-map
  • inline-source-map
  • cheap-module-source-map
  • inline-cheap-source-map
  • cheap-module-eval-source-map
  • inline-cheap-module-source-map
  • hidden-source-map
  • nosources-source-map

这么多种,到底都有什么区别?如何选择呢?

2.2 配置项差异

这里就不一一就行分析了,直接上图:

devtool build rebuild 显示代码 SourceMap 文件 描述
(none) 很快 很快 无 无 无法定位错误
eval 快 很快(cache) 编译后 无 定位到文件
source-map 很慢 很慢 源代码 有 定位到行列
eval-source-map 很慢 一般(cache) 编译后 有(dataUrl) 定位到行列
eval-cheap-source-map 一般 快(cache) 编译后 有(dataUrl) 定位到行
eval-cheap-module-source-map 慢 快(cache) 源代码 有(dataUrl) 定位到行
inline-source-map 很慢 很慢 源代码 有(dataUrl) 定位到行列
hidden-source-map 很慢 很慢 源代码 有 无法定位错误
nosource-source-map 很慢 很慢 源代码 无 定位到文件
关键字 描述
inline 代码内通过 dataUrl 形式引入 SourceMap
hidden 生成 SourceMap 文件,但不使用
eval eval(…) 形式执行代码,通过 dataUrl 形式引入 SourceMap
nosources 不生成 SourceMap
cheap 只需要定位到行信息,不需要列信息
module 展示源代码中的错误位置

2.3 推荐配置

  1. 本地开发:

推荐:eval-cheap-module-source-map
理由:

  • 本地开发首次打包慢点没关系,因为 eval 缓存的原因,rebuild 会很快
  • 开发中,我们每行代码不会写的太长,只需要定位到行就行,所以加上 cheap
  • 我们希望能够找到源代码的错误,而不是打包后的,所以需要加上 module
  1. 生产环境:

推荐:(none)
理由:

  • 就是不想别人看到我的源代码

    3. 三种 hash 值

    Webpack 文件指纹策略是将文件名后面加上 hash 值。特别在使用 CDN 的时候,缓存是它的特点与优势,但如果打包的文件名,没有 hash 后缀的话将会很麻烦。
    例如我们在基础配置中用到的:filename: "[name][hash:8][ext],这里里面 [ ] 包起来的,就叫占位符,它们都是什么意思呢?请看下表:
占位符 解释
ext 文件后缀名
name 文件名
path 文件相对路径
folder 文件所在文件夹
hash 每次构建生成的唯一 hash 值,任意文件改动,整个项目的 hash 都会改变
chunkhash 根据 chunk 生成 hash 值,文件的改动只会影响其所在 chunk 的 hash 值
contenthash 根据文件内容生成hash 值,文件的改动只会影响自身的 hash 值

好了,关于webpack的基础篇就暂时讲到这里了,如有错误,欢迎指出,谢谢!