共计 2983 个字符,预计需要花费 8 分钟才能阅读完成。
webpack 是一个前端工程化十分重要动态模块化打包工具,能够帮咱们把 less、sass、esmodule、commonjs 等模块依赖解决成浏览器可辨认的动态资源。
尽管 webpack 十分好用,但它可配置项和语法十分的多,还是比拟难了解和把握的,让咱们从最根底的开始,一步步体验吧~
不应用 webpack 时
浏览器能够辨认局部 js 代码,即便没有 webpack,咱们代码也是可能运行在浏览器端的。
应用 esmodule 来做一个演示,新建一个 demo 文件夹,demo 文件夹内新建 src 文件夹和 index.html 文件,src 文件夹里有 util 文件夹和 index.js 文件,util 文件夹中新增 math.js 文件,我的项目构造如下
demo
├─ src
│ ├─ util
│ │ └─ math.js
│ ├─ index.js
└─ index.html
在 math.js 中应用模块化导出办法,index.js 中导入,并在 index.html 中通过 script 标签引入 index.js,留神这里的 script 标签要减少 type=”module”,示意模块化
// math.js
function add(a, b) {return a + b;}
function sub(a, b) {return a - b;}
export {add, sub};
// index.js
import {add, sub} from "./utils/math.js";
console.log(add(20, 30));
console.log(sub(20, 30));
// index.html
<script src="./src/index.js" type="module"></script>
阐明 esmodule 是能够被浏览器辨认的,但如果咱们只批改导入导出形式,改为 commonjs 时,浏览器就不能辨认了
// math.js
- export {add, sub};
+ module.exports = {
+ add,
+ sub,
+ };
// index.js
- import {add, sub} from "./utils/math.js";
+ const {add, sub} = require("./utils/math.js");
浏览器是不能辨认 commonjs 语法的,所以会报错
也就是说浏览器对于某些特定的语法并不反对,尽管能够抉择 commonjs 用于浏览器端的一些计划,但通过繁多的形式解决了这个问题,仍可能存在其它语法的解析问题,为了解决所有语法兼容问题,应用一种通用的解决形式,webpack 来对立解决浏览器对于某些语法不能解析的问题~
应用 webpack
首先要全局装置 webpack 和 webpack-cli
npm i webpack webpack-cli -g
webpack 会对咱们编写的代码进行编译,上面示意曾经编译了 index.js 和 math.js 文件,尽管有“warning”正告,但依然是编译胜利了的。
可在下面的代码中咱们并没有告知 webpack 该对哪个文件进行编译,以及最终编译到哪个文件夹中,怎么就能间接编译胜利呢?
其实它本身是有默认的编译规定的,将 src 文件夹下的 index.js 文件,以及 index.js 文件所用到的其它 js 文件的代码编译至 dist 文件夹下的 main.js 文件。
咱们在 index.html 中引入 main.js 文件看到编译后的后果啦~ 和下面应用 esmodule 导出的打印后果是统一的
初始化
要进一步体验 webpack,须要依赖于 node,在刚刚的 demo 文件夹根目录通过 npm init -y
初始化 node 我的项目,生成 package.json 文件。
在我的项目中再装置 webpack 和 webpack-cli,与全局版本 5.70.0 做辨别,咱们指定装置 5.60.0 版本 npm i webpack@5.60.0 -D
全局和我的项目中装置了 webpack 的状况下,间接执行 webpack 来看看应用的是哪个版本。
依然应用的是全局的 webpack 版本,当我的项目与全局 webpack 版本不统一时,可能会呈现一些问题,那咱们能够通过以下形式获取到我的项目中 webpack 版本。
- 间接找到我的项目 node_modules 目录下 .bin 文件夹的 webpack 指令
./node_modules/.bin/webpack
- 应用 npx 指令来执行 node_modules 下的命令
npx webpack
-
在 package.json 里的 ”script” 中定义指令
"script": {"build": "webpack"}
而后通过
npm run build
来执行
先在我的项目中通过 npm i webpack-cli -D
装置 webpack-cli,而后就能够通过以上任意一种形式执行我的项目中的 webpack
命令行
webpack 对文件进行编译时默认查找有两条规定,如果都不合乎,将无奈编译胜利
- 查找 src 文件夹下的 index.js 文件
- 执行 webpack.config.js 文件
将 index.js 文件名改为 main.js 后,编译就报错了
有时候咱们的我的项目构造不肯定能和 webpack 默认编译的规定保持一致,这时候能够通过命令行自定义编译规定
比方指定导入门路 --entry 文件名
,指定导出文件夹 --output-path 文件名
也能够定义在 package.json 中
"script": {“build”:“webpack --entry ./src/main.js --output-path ./build”}
而后通过 npm run build
来执行
咱们可能会有很多处规定须要自定义,包含解析模块的入口,进口,以及其它资源解析形式,如果通过命令行或者 package.json,可读性会很差,所以咱们通过一个独自的 js 文件来定义。
webpack.config.js
定义 webpack.config.js 文件,指定编译入口为 src 下的 main.js,进口为 dist 文件夹下的 bundle.js,再通过 module.exports 将定义的配置导出。
这里有两点须要留神
- webpack 是在 node 环境下解析的,所以须要通过 commonjs 的导出形式
- 编译入口能够应用相对路径,但进口须要应用绝对路径,通过 _diname 获取
以后文件所在的目录的绝对路径
const path = require("path");
module.exports = {
entry: "./src/main.js",
output: {
filename: "./bundle.js",
path: path.resolve(__dirname, "./dist"),
},
};
配置实现后就能够间接通过 npx webpack
来编译啦
这里也能够批改配置文件的名称,比方批改成 wk.config.js,也是能够通过 命令行 npx webpack --config wk.config.js
或者 package.json 中配置 build 规定来执行
依赖图
webpack 在解决应用程序时,它会依据命令或者配置文件找到入口文件,从入口开始,会生成一个依赖关系图,这个依赖关系图会蕴含应用程序中所需的所有模块(比方.js 文件、css 文件、图片、字体等),而后遍历图构造,打包一个个模块。
以上咱们对 webpack 进行了初体验,前面还有很多的配置规定,loader、plugin、source-map 等等,继续更新中~