1.什么是Webpack?
webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler),当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle
使用Webpack作为前端构建工具:
- 代码转换:TypeScript 编译成 JavaScript、SCSS 编译成 CSS 等。
- 文件优化:压缩 JavaScript、CSS、HTML 代码,压缩合并图片等。
- 代码分割:提取多个页面的公共代码、提取首屏不需要执行部分的代码让其异步加载。
- 模块合并:在采用模块化的项目里会有很多个模块和文件,需要构建功能把模块分类合并成一个文件。
- 自动刷新:监听本地源代码的变化,自动重新构建、刷新浏览器。
- 代码校验:在代码被提交到仓库前需要校验代码是否符合规范,以及单元测试是否通过。
- 自动发布:更新完代码后,自动构建出线上发布代码并传输给发布系统。
在webpack
应用中有两个核心:
- 1) 模块转换器,用于把模块原内容按照需求转换成新内容,可以加载非 JS 模块
- 2) 扩展插件,在 Webpack 构建流程中的特定时机注入扩展逻辑来改变构建结果或做你想要的事情。
2.webpack快速上手
2.1 安装(4.X)
1 | npm init -y |
这里webpack-cli的作用是 可以解析用户传递的参数,将解析好的参数传递给webpack来进行打包。
2.2 初始化项目
1 | ├── src # 源码目录 |
编写 a-module.js
1 | module.exports = 'hello'; |
编写 index.js
1 | // webpack 默认支持 模块的写法: |
这里我们使用
CommonJS
模块的方式引入,这种方式(在node中可以直接运行)默认在浏览器上是无法运行的,所以我们希望通过webpack
来进行打包!
2.3 打包配置
这里可以使用
npx webpack
,npx
是 5.2版本之后npm
提供的命令可以执行/module/.bin
下的(命令)可执行文件
我们可以发现已经产生了dist
目录,此目录为最终打包出的结果。dist/main.js
可以在html中直接引用,这里还提示我们默认mode
为production
npx webpack –mode development | npx webpack –mode production
也可以配置 script 脚本
webpack
默认支持0配置,配置scripts
脚本
1 | "scripts": { |
npm run
会执行 script中的命令, 执行npm run build
,默认会调用 node_modules/.bin
下的webpack
命令,内部会调用webpack-cli
解析用户参数进行打包。默认会以 src/index.js
作为入口文件。
2.4 webpack.config.js
我们打包时一般不会采用0配置,webpack
在打包时默认会查找当前目录下的 webpack.config.js or webpack.file.js
文件。
通过配置文件进行打包
新建 webpack.config.js
1 | // webpack 是基于nodejs(所以可以用node的所有模块) 所以语法规范是commonjs |
2.5 配置打包的mode
我们需要在打包时提供mode
属性来区分是开发环境还是生产环境,来实现配置文件的拆分
新建build/ 文件夹
1 | ├── build |
我们可以通过指定不同的文件来进行打包
配置scripts
脚本
1 | "scripts": { |
可以通过 --config
参数指定,使用哪个配置文件来进行打包
通过env参数区分
1 | "scripts": { |
改造webpack.base
文件默认导出函数,会将环境变量传入到函数的参数中
1 | module.exports = (env)=>{ |
合并配置文件
我们可以判断当前环境是否是开发环境来加载不同的配置,这里我们需要做配置合并
安装webpack-merge
:
1 | npm install webpack-merge --save-dev |
webpack.dev
配置
1 | module.exports = { |
webpack.prod
配置
1 | module.exports = { |
webpack.base
配置
1 | const path = require('path'); |
后续的开发中,我们会将公共的逻辑放到base
中,开发和生产对的配置也分别进行存放!
3.webpack-dev-server
配置开发服务器,它是在内存中打包的,不会产生实体文件,并且自动启动服务
1 | npm install webpack-dev-server --save-dev |
1 | "scripts": { |
通过执行npm run dev
来启启动开发环境
默认会在当前根目录下启动服务
配置开发服务的配置
1 | const path = require('path') |
4.打包Html插件
4.1 单入口打包
自动产生html,并引入打包后的js文件
新建 /public/index.html
1 |
|
配置插件,在打包结束后会将打包的结果自动引进来 并且产生文件到当前的dist/下
编辑webpack.base
文件
1 | const path = require('path'); |
1 | { |
运行
npm run dev
可以看到生成了一个index.html文件,但是是在内存中的看不到,可以访问 http://localhost:3000/ 看到有上面的console.log打印 a-module.js中的内容。运行
npm run build
可以看到dist/下生成了 index.html 、bundle.js,并且 html中自动引入了这个打包后的文件。
4.2 多入口打包
根据不同入口 生成多个js文件,引入到不同html中
1 | ── src |
多入口需要配置多个entry
1 | // entry有三种写法 字符串 数组 对象 |
产生多个Html文件
1 | new HtmlWebpackPlugin({ |
1 | 注入选项。有四个选项值 true, body, head, false. |
以上的方式不是很优雅,每次都需要手动添加HtmlPlugin
应该动态产生html
文件,像这样:
1 | let htmlPlugins = [ |
5.清空打包结果
可以使用clean-webpack-plugin
手动清除某个文件夹内容:
安装
1 | npm install --save-dev clean-webpack-plugin |
放到 webpack.prod.js 中
1 | const { CleanWebpackPlugin } = require('clean-webpack-plugin'); |
这样就可以清空指定的目录了,我们可以看到webpack
插件的基本用法就是 new Plugin
并且放到plugins
中