Ryker‘s

  • {{ item.name }}
  • 主页
  • 前端
  • 后端
  • 算法
  • 随笔
  • 关于博主
  • 文章归档
  • 友情链接

Webpack基础配置知识

  • Ryker
  • 2023-03-08
  • 0

目录

webpack配置知识

  1. 什么是webpack?
  2. 在项目中安装webpack
  3. 在项目中配置webpack
  4. webpack.config.js 文件的作用
  5. webpack 中的默认约定
  6. 自定义打包的入口与出口

webpack 中的插件

  1. webpack 插件的作用
  2. webpack-dev-server
  3. html-webpack-plugin
  4. devServer 节点

webpack中的loader

  1. loader 概述
  2. loader的调用过程
  3. 打包处理 less 文件
  4. 打包处理样式表中与url路径相关的文件
  5. 打包处理 js 文件中的高级语法

打包发布

  1. 为什么要打包发布
  2. 配置 webpack 的打包发布
  3. 把 JavaScript 文件统一生成到 js 目录中
  4. 把图片文件统一生成到 image 目录中
  5. 自动清理 dist 目录下的旧文件

Source Map

  1. 生产环境遇到的问题
  2. 什么是Source Map
  3. webpack 开发环境下的 Source Map
  4. webpack 生产环境下的 Source Map
  5. Source Map 的最佳实践

已完结
参考博客(opens new window)

我是把它的代码格式和文档处理了一下

  1. 什么是webpack?

概念:webpack 是前端项目工程化的具体解决方案。

主要功能:它提供了友好的前端模块化开发支持,以及代码压缩混淆、处理浏览器端 JavaScript 的兼容性、性能优化等强大的功能。

好处:让程序员把工作的重心放到具体功能的实现上,提高了前端开发效率和项目的可维护性。
注意:目前 Vue,React 等前端项目,基本上都是基于 webpack 进行工程化开发的

  1. 在项目中安装webpack

在终端运行如下的命令,安装 webpack 相关的两个包

npm install webpack@5.42.1 webpack-cli@4.7.2 -D
ps: -D的意义是将webpack文件安装在开发版本中,也就是devDependencies 仅在开发环境下使用。

扩展:

npm安装时-S -D分别的意思 -S 即--save(保存) 包名会被注册在package.json的dependencies里面,在生产环境下这个包的依赖依然存在 -D 即--dev(开发) 包名会被注册在package.json的devDependencies里面,仅在开发环境下存在的包用-D,如babel,sass-loader这些解析器

注意:在使用npm install一个插件的时候,需要添加上-s或-d,不然不会再package.json中显示。

  1. 在项目中配置webpack

①在项目根目录中,创建名为 webpack.config.js 的 webpack 配置文件,并初始化如下的基本配置:

module.exports = {
    mode:'development' 
    // mode用来指定构建模式。可选值有development 和 production
}

②在 package.json 的 scripts 节点下,新增 dev 脚本如下:

“script”:{
    “dev” : "webpack" 
    // script 节点下的脚本,可以通过 npm run dev执行
}

③在终端中运行 npm run dev 命令,启动 webpack 进行项目的打包构建

mode的🉑️选值
(1)development
⚫开发环境
⚫不会对打包生成的文件进行代码压缩和性能优化
⚫打包速度快,适合在开发阶段使用
(2)production
⚫ 生产环境
⚫ 会对打包生成的文件进行代码压缩和性能优化
⚫ 打包速度很慢,仅适合在项目发布阶段使用

  1. webpack.config.js 文件的作用

webpack.config.js 是 webpack 的配置文件。webpack 在真正开始打包构建之前,会先读取这个配置文件, 从而基于给定的配置,对项目进行打包。

注意:由于 webpack 是基于 node.js 开发出来的打包工具,因此在它的配置文件中,支持使用 node.js 相关 的语法和模块进行 webpack 的个性化配置

5.webpack 中的默认约定

在 webpack 4.x 和 5.x 的版本中,有如下的默认约定:
① 默认的打包入口文件为 src -> index.js
② 默认的输出文件路径为 dist -> main.js
注意:可以在 webpack.config.js 中修改打包的默认约定

6.自定义打包的入口与出口

在 webpack.config.js 配置文件中,通过 entry 节点指定打包的入口。通过 output 节点指定打包的出口。

module.exports = {
    entry: path.join(__dirname,'./scr/index.js'), //打包入口文件路径
    output:{
        path:path.join(__dirname,'./dist'), // 输出文件的存放路径
        filename:‘bundle.js’ //输出文件的名称
    }
}

​​​​​​​webpack 中的插件

  1. webpack 插件的作用

通过安装和配置第三方的插件,可以拓展 webpack 的能力,从而让 webpack 用起来更方便。最常用的 webpack 插件有如下两个:

① webpack-dev-server
⚫ 类似于 node.js 阶段用到的 nodemon 工具
⚫ 每当修改了源代码,webpack 会自动进行项目的打包和构建

② html-webpack-plugin
⚫ webpack 中的 HTML 插件(类似于一个模板引擎插件)
⚫ 可以通过此插件自定制 index.html 页面的内容

  1. webpack-dev-server

webpack-dev-server 可以让 webpack 监听项目源代码的变化,从而进行自动打包构建。

2.1安装 webpack-dev-server

运行如下的命令,即可在项目中安装此插件:

npm install webpack-dev-server@3.11.2 -D

2.2配置 webpack-dev-server

① 修改 package.json -> scripts 中的 dev 命令如下:

“script”:{
    “dev” : "webpack server" 
    // script 节点下的脚本,可以通过 npm run dev执行
}

② 再次运行 npm run dev 命令,重新进行项目的打包
③ 在浏览器中访问 http://localhost:8080 地址,查看自动打包效果

注意:webpack-dev-server 会启动一个实时打包的 http 服务器

2.3 打包生成的文件哪儿去了?

① 不配置 webpack-dev-server 的情况下,webpack 打包生成的文件,会存放到实际的物理磁盘上

⚫ 严格遵守开发者在 webpack.config.js 中指定配置
⚫ 根据 output 节点指定路径进行存放

② 配置了 webpack-dev-server 之后,打包生成的文件存放到了内存中

⚫ 不再根据 output 节点指定的路径,存放到实际的物理磁盘上
⚫ 提高了实时打包输出的性能,因为内存比物理磁盘速度快很多

2.4 生成到内存中的文件该如何访问?

webpack-dev-server 生成到内存中的文件,默认放到了项目的根目录中,而且是虚拟的、不可见的。

⚫ 可以直接用 / 表示项目根目录,后面跟上要访问的文件名称,即可访问内存中的文件
⚫ 例如 /bundle.js 就表示要访问 webpack-dev-server 生成到内存中的 bundle.js 文件

  1. html-webpack-plugin

html-webpack-plugin 是 webpack 中的 HTML 插件,可以通过此插件自定制 index.html 页面的内容。

需求:通过 html-webpack-plugin 插件,将 src 目录下的 index.html 首页,复制到项目根目录中一份!

3.1 安装 html-webpack-plugin

运行如下的命令,即可在项目中安装此插件:

npm install html-webpack-plugin@5.3.2 -D

3.2 配置 html-webpack-plugin

//1,导入HTML 插件,得到一个构造函数
const HtmlPlugin = require(' html-webpack-plugin ')
//2,创建 HTML 插件的实例对象

const htmlPlugin = new HtmlPlugin({
    template:'./src/index.html', 
    //指定原文件的存放路径
    filename:'./index.html', 
    // 指定生成的文件的存放路径
})

module.exports = {
    mode:'development',
    plugins:[htmlPlugin], 
    //3.通过plugins节点,使HTMLPlugin插件生效
}

3.3 解惑 html-webpack-plugin

① 通过 HTML 插件复制到项目根目录中的 index.html 页面,也被放到了内存中
② HTML 插件在生成的 index.html 页面,自动注入了打包的 bundle.js 文件

  1. devServer 节点

在 webpack.config.js 配置文件中,可以通过 devServer 节点对 webpack-dev-server 插件进行更多的配置,

示例代码如下:

devServer:{
    open:true, 
    //初次打包完成后,自动打开浏览器
    host:‘ 127.0.0.1 ’ , 
    //实时打包所使用的主机地址
    port:80,
    //实施打包所使用的端口号
}

注意:凡是修改了 webpack.config.js 配置文件,或修改了 package.json 配置文件,必须重启实时打包的服 务器,否则最新的配置文件无法生效!

webpack中的loader

  1. loader 概述

在实际开发过程中,webpack 默认只能打包处理以 .js 后缀名结尾的模块。
其他非 ".js" 后缀名结尾的模块, webpack 默认处理不了,需要调用 loader 加载器才可以正常打包,否则会报错!

loader 加载器的作用:协助 webpack 打包处理特定的文件模块。比如:

⚫ css-loader 可以打包处理 .css 相关的文件
⚫ less-loader 可以打包处理 .less 相关的文件
⚫ babel-loader 可以打包处理 webpack 无法处理的高级 JS 语法

  1. loader的调用过程

第一步,判断这个要处理的文件是不是js文件,然后就去配置文件中,查找有没有对应的第三方loader规则。第二步,如果找到了对应的规则,就会调用对应的loader 处理这种文件。

第三步,在调用loader的时候,是从后往前调用的。

最后,当最后一个loader调用完毕,会把处理的结果,直接交给webpack进行打包合并,并最终输出到bundle.js 中去。

也就是:

  1. webpack只能打包.js结尾的文件,处理不了其他后缀的文件。
  2. 由于代码中包含了index.css这个文件,所以webpack处理不了
  3. 当webpack发现某个文件处理不了的时候,会查找webpack.config.js这个配置文件,看module.rules数组中,是否配置了对应的loader加载器。
  4. webpack把index.css这个文件,先转交给最后一个loader进行处理(先转交给css-loader)。
  5. 当css-loader处理完毕之后,会把处理的结果转交给下一个loader(转交给style-loader)。
  6. 当style-loader处理完毕后发现没有下一个loader了,于是就把处理的结果转交给了webpack。
  7. webpack把style-loader处理的结果,合并到/dist/bundle.js中,最终生成打包好的文件
  8. 打包处理css文件

① 运行 npm i style-loader@3.0.0 css-loader@5.2.6 -D 命令,安装处理 css 文件的 loader
② 在 webpack.config.js 的 module -> rules 数组中,添加 loader 规则如下:

module:{ // 所有第三方文件模块的匹配规则
    rules:[//文件后缀名的匹配规则
        { test:/\.css$/, use:['style-loader',' css-loader '] }
    ]
}

其中,test表示匹配的文件类型,use表示对应要调用的loader

注意:

⚫ use 数组中指定的 loader 顺序是固定的
⚫ 多个 loader 的调用顺序是:从后往前调用

  1. 打包处理 less 文件

① 运行 npm i less-loader@10.0.1 less@4.1.1 -D 命令

② 在 webpack.config.js 的 module -> rules 数组中,添加 loader 规则如下:

module:{undefined
    rules:[//文件后缀名的匹配规则
        { test:/\.css$/, use:['style-loader',' css-loader ',' less-loader '] },
    ]
}
  1. 打包处理样式表中与url路径相关的文件

① 运行 npm i url-loader@4.1.1 file-loader@6.2.0 -D 命令
② 在 webpack.config.js 的 module -> rules 数组中,添加 loader 规则如下:

module:{ // 所有第三方文件模块的匹配规则
    rules:[ //文件后缀名的匹配规则
    //超过了limit的话就不转换成base64
        { test:/\.jpg|png|gif$/, use:' url-loader?limit=22229 ' },
    ]
}

其中" ?"之后的是loader的参数项

⚫ limit 用来指定图片的大小,单位是字节(byte)
⚫ 只有 ≤ limit 大小的图片,才会被转为 base64 格式的图片

  1. 打包处理 js 文件中的高级语法

webpack只能打包处理一部分高级的JavaScript语法。

对于那些webpack无法处理的高级js语言,需要借助于babel-loader进行打包处理。

安装babel-loader相关的包

运行如下的命令安装对应的依赖包:

npm i babel-loader@8.2.2 @babel/core@7.14.6 @babel/plugin-proposal-decorators@7.14.5 -D

在 webpack.config.js 的 module -> rules 数组中,添加 loader 规则如下:

//注意:必须使用 exclude 指定排除项;
//因为 node_modules 目录下的第三方包不需要被打包
{ test: /.js$/,use: ' babel-loader ' , exclude: / node_modules/}
配置babel-loader

在项目根目录下,创建名为babel.config.js 的配置文件,定义babel 的配置项如下:

module.exports={undefined
    plugins: [[' @babel/plugin-proposal-decorators ' , { legacy:true}]]
}

打包发布

  1. 为什么要打包发布

项目开发完成之后,需要使用 webpack 对项目进行打包发布,主要原因有以下两点:

① 开发环境下,打包生成的文件存放于内存中,无法获取到最终打包生成的文件
② 开发环境下,打包生成的文件不会进行代码压缩和性能优化

为了让项目能够在生产环境中高性能的运行,因此需要对项目进行打包发布。

  1. 配置 webpack 的打包发布

在 package.json 文件的 scripts 节点下,新增 build 命令如下:

" scripts " : {
    " div " : " webpack server ", 
    //开发环境中,运行 dev命令
    " build " : " webpack --mode production " 
    // 项目发布时,运行 build 命令。
}

--mode是一个参数项,用来指定webpack 的运行模式。production代表生产环境,会对打包生成的文件进行代码压缩和性能优化。

注意:
通过 --mode 指定的参数项,会覆盖 webpack.config.js 中的 model选项。

  1. 把 JavaScript 文件统一生成到 js 目录中

在webpack.config.js 配件文件的output 节点中,进行如下配置:

output: {undefined
    path : path.join(__dirname,' dist '),
    //明确告诉 webpack 把生成的 bundle.js 文件
    //存放到 dist 目录下的 js 子目录中
    filename: ' js/bundle.js' ,
}
  1. 把图片文件统一生成到 image 目录中

修改 webpack.config.js 中的 url-loader 配置项,

新增 outputPath 选项即可指定图片文件的输出路径:

{
test: /.jpg|png|gif$/,
use:{
    loader: ' url-loader ',
    options:{
        limit:22228,
        // 明确指定把打包生成的图片文件,存储到dist 目录下的 image 文件夹中。
        outputPath:' image ',
        } ,
    },
}
  1. 自动清理 dist 目录下的旧文件

为了在每次打包发布时自动清理掉 dist 目录中的旧文件,可以安装并配置 clean-webpack-plugin插件 :

// 1,安装清理dist 目录的webpack 插件
npm install clean-webpack-plugin@3.0.0 -D

// 2,按需导入插件,得到插件的构造函数之后,创建插件的实例对象
const { CleanWebpackPlugin } = require (' clean-webpack-plugin')
const cleanPlugin = new CleanWebpackPlugin()

// 3,把创建的 cleanPlugin 插件实例对象,挂载到 plugins节点中
plugins:[ htmlPlugin,cleanPlugin ] , //挂载插件
Source Map
  1. 生产环境遇到的问题

前端项目在投入生产环境之前,都需要对 JavaScript 源代码进行压缩混淆,从而减小文件的体积,提高文件的 加载效率。此时就不可避免的产生了另一个问题:

对压缩混淆之后的代码除错(debug)是一件极其困难的事情

⚫ 变量被替换成没有任何语义的名称
⚫ 空行和注释被剔除

  1. 什么是Source Map

Source Map 就是一个信息文件,里面储存着位置信息。也就是说,Source Map 文件中存储着压缩混淆后的 代码,所对应的转换前的位置。

有了它,出错的时候,除错工具将直接显示原始代码,而不是转换后的代码,能够极大的方便后期的调试。

  1. webpack 开发环境下的 Source Map

在开发环境下,webpack 默认启用了 Source Map 功能。当程序运行出错时,可以直接在控制台提示错误行 的位置,并定位到具体的源代码:

即出错后报错会提示具体源代码的位置: index.js : 20

3.1默认 Source Map 的问题

开发环境下默认生成的 Source Map,记录的是生成后的代码的位置。会导致运行时报错的行数与源代码的行 数不一致的问题。

3.2 解决默认 Source Map 的问题

开发环境下,推荐在 webpack.config.js 中添加如下的配置,即可保证运行时报错的行数与源代码的行数 保持一致:

module.export = {
    mode: ' development ',
    // eval-source-map 仅限在“开发模式”下使用,不建议在“生产模式”下使用。
    // 次选项生成的 Source Map 能够保证“ 运行时报错的行数 ” 与 “ 源代码的行数 ” 保持一致
    devtool: ' eval-source-map ',
    // 省略其他配置项
}
  1. webpack 生产环境下的 Source Map

在生产环境下,如果省略了 devtool 选项,则最终生成的文件中不包含 Source Map。这能够防止原始代码通 过 Source Map 的形式暴露给别有所图之人。

4.1 只定位行数不暴露源码

在生产环境下,如果只想定位报错的具体行数,且不想暴露源码。此时可以将 devtool 的值设置为 nosources-source-map。

4.2 定位行数且暴露源码

在生产环境下,如果想在定位报错行数的同时,展示具体报错的源码。此时可以将 devtool 的值设置为 source-map。

采用此选项后:你应该将你的服务器配置为,不允许普通用户访问 source map 文件!

  1. Source Map 的最佳实践

① 开发环境下:

⚫ 建议把 devtool 的值设置为 eval-source-map

⚫ 好处:可以精准定位到具体的错误行

② 生产环境下:

⚫ 建议关闭 Source Map 或将 devtool 的值设置为 nosources-source-map

⚫ 好处:防止源码泄露,提高网站的安全性

总结:

实际开发中需要自己配置 webpack 吗?

答:

⚫ 实际开发中会使命令行工具(俗称 CLI)一键生成带有 webpack 的项目

⚫ 开箱即用,所有 webpack 配置项都是现成的!

⚫ 我们只需要知道 webpack 中的基本概念即可

© 2023 Ryker‘s
Theme by Wing
鄂ICP备2022010847号-1