- 作者:老汪软件技巧
- 发表时间:2024-09-08 07:02
- 浏览量:
最近 Rspack 发布了 1.0 版本,这是由字节 web infra 团队打造的一款 Web 打包器。其创立时最主要的目标之一就是要兼容 webpack API 和生态系统,这样能帮助字节内部大量基于 webpack 打包的项目丝滑迁移。
相比较于 webpack 这样一个基于 JS 编写的打包器,Rspack 基于 Rust 编写,其打包速度直接碾压 webpack。当然,这并不表示现在学习 webapck 没有价值了。
之所以启动这个 webpack 入门系列教程,主要有 2 点考虑:
目前企业中还广泛存在的基于 webpack 打包的项目,学习 webpack 有利于我们理解目前的手头项目。webpack 可以说是 Web 界元老级别的打包器了,虽然 webpack 的打包机制和打包速度常受诟病,但其完善的文档和强大的生效仍然它的优势虽然 Rspack 有其速度独优势,但其 API 架构和生态很大一方面还是基于 webpack 的。学好 webpack 也是在间接巩固 Rspack 的基础
作为 webpack 系列的第一篇,我们的目标是快速创建一个 webpack 项目并进行第一个应用程序的打包。
废话不多说,开始吧。
项目初始化
mkdir webpack-demo
cd .\webpack-demo\
npm init -y
# 使用 VS Code 打开
code .
安装 webpack
为了使用 webpack 我们需要安装 2 个开发依赖包:
npm install -D webpack webpack-cli
截至目前 webpack 的最新版本如下:
cat .\package.json
{
"name": "webpack-demo",
"version": "1.0.0",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"description": "",
"devDependencies": {
"webpack": "^5.94.0",
"webpack-cli": "^5.1.4"
}
}
webpack 5 的最低 Node 版本要求是 10.13.0 (LTS),可以说非常低了。
你肯定会有疑问:webpack、webpack-cli 的作用分别是什么?
import webpack from 'webpack';
const compiler = webpack({
// ...
});
npx webpack
assets by status 0 bytes [cached] 1 asset
WARNING in configuration
The 'mode' option has not been set, webpack will fallback to 'production' for this value.
Set 'mode' option to 'development' or 'production' to enable defaults for each environment.
You can also set it to 'none' to disable any default behavior. Learn more: https://webpack.js.org/configuration/mode/
ERROR in main
Module not found: Error: Can't resolve './src' in 'D:\solo\webpack-demo'
resolve './src' in 'D:\solo\webpack-demo'
其实在 webpack 3 及之前的版本,只有一个 webpack 依赖包,在 webpack 4 中,将原本包里的 CLI 能力单独拆分出来成为 webpack-cli,保证在单独使用 webpack API 时,依赖的精简。
创建配置文件指定打包入口
以上,我们在执行 npx webpack 的时候报错了。原因很简单,就是我们没有为 webpack 指定。
关于打包入口等这类 webpack 配置,我们通过在项目根目录创建 webpack.config.js 文件来指定。
webpack.config.js 是 webpack 指令执行时默认查找并执行的配置。
// webpack.config.js
module.exports = {
entry: './src/index.js'
}
src/index.js 很简单:
console.log('Hello, webpack!')
再次执行 npx webpack:
npx webpack
asset main.js 31 bytes [emitted] [minimized] (name: main)
./src/index.js 31 bytes [built] [code generated]
WARNING in configuration
The 'mode' option has not been set, webpack will fallback to 'production' for this value.
Set 'mode' option to 'development' or 'production' to enable defaults for each environment.
You can also set it to 'none' to disable any default behavior. Learn more: https://webpack.js.org/configuration/mode/
webpack 5.94.0 compiled with 1 warning in 159 ms
打包成功,发现项目根目录下创建了一个 dist/main.js 文件:
文件内容如下:
指定打包输出
当然,我们也可以指定打包输出文件(Output):
// webpack.config.js
module.exports = {
entry: './src/index.js',
output: {
filename: 'bundle.js'
}
}
再次执行 npx webpack,发现 dist 目录下多了一个 bundle.js 文件,内容与 main.js 一样。
当然,你也可以通过 ouput.path 指定输出目录:
const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
filename: 'bundle.js',
+ path: path.resolve(__dirname, 'dist/assets'),
}
}
再次执行 npx webpack,发现打包文件成功输出到了 dist/assets 目录里。
指定打包模式
webpack 从 v4 版本开始,引入了的概念,有 3 个可能取值:'none'、'development' 和 'production'。
项目打包时,必须要显式声明打包模式,否则打包会有告警出现。
WARNING in configuration
The 'mode' option has not been set, webpack will fallback to 'production' for this value.
Set 'mode' option to 'development' or 'production' to enable defaults for each environment.
You can also set it to 'none' to disable any default behavior. Learn more: https://webpack.js.org/configuration/mode/
当 mode 为 'development' 是,webpack 会启用针对开发阶段的一些优化配置;当 mode 为 'production' 是,webpack 会启用针对生产环境的一些优化配置。
实际项目中,通常会为开发和生产环境单独设置配置文件。比如:webpack.dev.config、webpack.prod.config.js。
// webpack.dev.config.js
module.exports = {
entry: './src/index.js',
mode: 'development',
output: {
filename: 'bundle.js',
}
}
// webpack.prod.config.js
module.exports = {
entry: './src/index.js',
mode: 'production',
output: {
filename: 'bundle.js',
}
}
再在 package.json 中添加 script。
{
"scripts": {
"dev": "webpack --config webpack.dev.config.js",
"build": "webpack --config webpack.prod.config.js"
},
}
webpack 指令后的 --config 参数用于指定配置文件(默认是 webpack.config.js,其他可用指令可以参考 npx webpack -h 输出)。
这样一来,我们就能通过 npm run dev、npm run build 分别进行开发环境和生产环境的打包了。
虽然我们可以通过 webpack --mode development/production 在命令行指定开发模式,但实际项目里还是倾向于把配置都写入到配置文件中去
引入开发服务器为什么要引入?
现在执行完 npm run dev 之后,我们就得到了 dist/bundle.js 文件了。现在,我们再在项目根目录下创建一个 index.html 去引用这个文件。
"en">
<head>
"UTF-8">
"viewport" content="width=device-width, initial-scale=1.0">
Document