前端工程化即,在企业级的前端项目开发中,把前端开发所需的工具、技术、流程、经验等进行规范化、标准化。这样有利于前端开发自成体系,有一套标准的开发方案和流程。
早期解决方案:
目前主流方案:
-D
是 --save-dev
的缩写,表示开发时依赖,只在项目开发阶段用到。 -S
是 --save
的缩写,表示运行时依赖,即项目打包发布运行时要用到。
npm install webpack@5.42.1 webpack-cli@4.7.2 -D
项目根目录中创建 webpack.config.js 配置文件,初始化基本配置:
module.exports = {
// mode 用于指定构建模式,可选值有 development 和 production
mode: 'development',
}
在 package.json
文件的 scripts
节点下,新增 dev
脚本:
"scripts" :{
// 配置好后就能通过 npm run dev 命令执行打包过程
"dev": "webpack"
}
在终端中运行 npm run dev
命令,即可启动 webpack 进行项目的打包构建
. development
代表开发环境
不会对打包生成的文件进行代码压缩和性能优化
打包速度快,适合开发阶段使用
. production
代表生产环境
会对打包生成的文件进行代码压缩和性能优化
打包速度慢,仅推荐在发布阶段使用
webpack.config.js 是 webpack 的配置文件。webpack 在真正开始打包构建之前,会先读取这个配置文件,从而基于给定的配置,对项目进行打包。
在 webpack 4.x 和 5.x 版本中,默认约定:
默认打包入口文件为
src/index.js
默认输出文件路径为
dist/main.js
在 webpack.config.js 配置文件中,通过 entry
节点指定打包入口,output
节点指定打包出口。
const path = require('path')
module.exports = {
entry: path.join(__dirname, './src/index.js'),
output: {
path: path.join(__dirname, './dist'), // 输出文件的存放路径
filename: 'bundle.js', // 输出文件的名称
},
}
webpack-dev-server 让 webpack 能监听项目源码的变化,从而自动打包构建。
npm install webpack-dev-server@3.11.2 -D
1.修改 package.json -> scripts
的 dev
命令:
"scripts": {
"dev": "webpack serve"
}
运行 npm run dev
命令,重新打包项目
浏览器访问 http://localhost:8080
地址,查看打包效果
webpack-dev-server 生成的文件默认放在项目根目录中,是虚拟不可见的。
html-webpack-plugin 是 webpack 中的 HTML 插件,可以通过此插件自定制 index.html 页面的内容。 通过 html-webpack-plugin 插件,将 src 目录下的 index.html 首页,复制到项目根目录中。
npm install html-webpack-plugin@5.3.2 -D
在 webpack.config.js 进行配置:
const HtmlPlugin = require('html-webpack-plugin')
const htmlPlugin = new HtmlPlugin({
template: './src/index.html', // 指定原文件的路径
filename: './index.html' // 指定生成文件的路径
})
module.exports => {
mode: 'development',
plugins: [htmlPlugin]
}
通过 webpack.config.js 文件的 devServer
节点对 webpack-dev-server 插件进行更多的配置。
devServer: {
open: true, // 初次打包完成后,自动打开浏览器
host: '127.0.0.1', // 访问地址
port: 80 // 访问端口号
}
webpack 默认只能打包 .js 结尾的模块,其他模块需要调用对应的 loader 加载器才能进行打包,即协助 webpack 打包特定的文件模块。
运行 npm i [email protected] [email protected] -D
命令,安装 loader
在 webpack.config.js 文件的 module->rules
数组添加规则:
module: {
rules: [{ test: /\.css$/, use: ['style-loader', 'css-loader'] }]
}
test 表示匹配的文件类型,use 表示对应调用的 loader
use 数组的 loader 顺序是固定的
loader 调用顺序是从后往前
1.运行 npm i [email protected] [email protected] -D
命令
2.在 webpack.config.js 文件的 module->rules
数组添加规则:
module: {
rules: [{ test: /\.less$/, use: ['style-loader', 'css-loader', 'less-loader'] }]
}
1.运行 npm i [email protected] [email protected] -D
命令
2.在 webpack.config.js 文件的 module->rules
数组添加规则:
module: {
rules: [{ test: /\.jpg|png|gif$/, use: ['url-loader?limit=22229'] }]
}
limit 用于指定图片大小,单位是 byte
只有 <= limit 大小的图片才会被转为 base64 格式 (opens new window)的图片
1.运行 npm i [email protected] @babel/[email protected] @babel/[email protected] -D
安装 babel
2.在 webpack.config.js 文件的 module->rules
数组添加规则:
module: {
rules: [{ test: /\.js$/, use: 'babel-loader', exclude: /node_modules/ }]
}
3.配置 babel:在项目根目录下,创建名为 babel.config.js 的配置文件,定义 Babel 的配置项:
module.exports = {
// 声明 babel 可用的插件
plugins: [['@babel/plugin-proposal-decorators', { legacy: true }]],
}
在 package.json 文件的 scripts
节点,新增 build
命令:
"scripts": {
"dev": "webpack serve",
"build": "webpack --mode production"
}
--model
指定 webpack 的运行模式,会覆盖 webpack.config.js 中的 model
选项在 webpack.config.js 配置文件的 output 节点中,进行配置:
ouput: {
path: path.join(__dirname, 'dist'),
// 将 bundle.js 文件存放到 dist 目录的 js 子目录中
filename: 'js/bundle.js',
}
修改 webpack.config.js 中的 url-loader 配置项,新增 outputPath 选项指定图片文件的输出路径:
{
test: /\.jpg|png|gif$/,
use: {
loader: 'url-loader',
options: {
limit: 23333,
// 指明生成的图片存到 dist 目录下的 image 子目录中
outputPath: 'image'
}
}
}
1.安装 clean-webpack-plugin 插件
npm install clean-webpack-plugin@3.0.0 -D
2.在 webpack.config.js 文件中进行配置:
const { CleanWebpackPlugin } = require('clean-webpack-plugin')
// plugins 节点挂载 CleanWebpackPlugin 实例对象
plugins: [htmlPlugin, new CleanWebpackPlugin()]
企业级项目打包发布的流程更复杂:
项目 npm run build
打包之后,默认情况下在本地双击 dist/index.html
是无法看到项目效果的,如果想要看到效果需要进行配置。 vue.config.js
文件将 publicPath
改为 './'
即可,默认为 '/'
。
module.exports = {
publicPath: './',
}
Source Map 就是一个信息文件,里面储存着位置信息,它存储着压缩混淆后的代码,所对应的转换前的位置。当我们运行打包生成的代码出错时,就能通过报错信息定位到源码的出错位置。
开发环境下:
devtool
设置为eval-source-map
生产环境下:
// webpack.config.js 文件
module.exports = {
mode: 'development',
devtool: 'eval-source-map',
}