Webpack5 上手
0x0 前言
之前很多项目都用到 Webpack
这个工具,毕竟目前前端领域上它所占的地位相当高,使用它可以减少大量的前端工作提高工作效率。不过最近俩年使用 Webpack4
的版本,虽然没有遇到太大的问题,不过官方在今年十月份正式推出 Webpack5
的大版本,翻阅下更新日志改动 API
地方还蛮多的,正好最近需要用到它所以尝试下新版本的脚手架工具。所以本文写得非常简单,做个索引备用。
0x1 安装
说到底是它就是工具,不是那种 jQuery
、Vue
等这些天天用得到的东西,很多 API
需要查阅才得知,然而查阅过程却很蛋疼,因为资料太多了,一时无法下手,所以耐着心搞好第一个脚手架。
我的环境是 macOS Big Sur 11.0.1
,在此环境进行新建个符合现代化前端开发构建工具:
-
支持
Babel
语法转换 -
支持
SCSS
预处理器 -
支持
POSTCSS
浏览器厂商前缀兼容 -
支持
ESLint
语法检测 -
热更新加载
我本机环境如下:
Last login: Thu Dec 3 11:09:13 on ttys001
jaxson@iMac:~ » node -v
v12.19.1
jaxson@iMac:~ » npm -v
6.14.8
新版本工具对 Node
要求高,建议安装最新的版本即可。
运行 webpack 5 的 Node.js 最低版本是 10.13.0 (LTS)
0x2 初始化
熟悉 Webpack
的同学完全可以 yarn init
来安装自己想要的东西,但对我半生不熟的可以用脚手架的命令来初始化:
mkdir webpack5-demo
webpack-cli init
如果没有全局安装 webpack-cli
可以执行下面命令:
mkdir webpack5-demo
npx webpack-cli init
然后根据终端返回的信息进行配置,配置完毕后在项目目录下新建个 config/webpack.dev.js
文件:
const path = require('path')
const resolve = dir => {
return path.join(__dirname, dir)
}
module.exports = {
mode: 'development',
entry: {
index: [
'./src/js/index.js',
]
},
output: {
filename: 'index.js'
},
devtool: 'source-map',
resolve: {
alias: {
'@': resolve('../src')
}
}
}
这样就形成最基础的开发环境配置文件,然后在项目的根目录下新建 index.html
文件里面引入上面输出的的脚本:
<script src="index.js"></script>
保存后在 package.json
里面添加字段:
"scripts": {
"dev": "webpack serve --config config/webpack.dev.js"
}
然后在 src/js/index.js
填入:console.log('hello world')
,完成之后在终端运行 yarn dev
,在浏览器即可看到脚本输出的内容,就这样最简单的构建工具完成了。但功能支持上远远不够,还需要做额外的支持。
0x3 DevServer
针对 development
模式开启一个 http
服务,为了上面所提到的支持功能选择 webpack-dev-server
工具包作为服务:
yarn add webpack-dev-server -D
然后继续修改 config/webpack.dev.js
文件,在原来基础上添加一个字段:
devServer: {
contentBase: resolve('../src/html'),
host: '0.0.0.0',
port: 65506,
hot: true,
open: false,
clientLogLevel: 'silent'
},
contentBase
:将index.html
从根目录移动到src/html
目录下是因为更好的管理host
: 主机地址port
:端口号hot
:热加载open
:服务加载打开网页clientLogLevel
:关闭无用日志
然后启动服务就会看到自己想看到效果
0x4 Babel
安装依赖:
yarn add babel-loader @babel/core @babel/preset-env webpack -D
config/webpack.dev.js
添加规则:
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env']
}
}
}
]
}
0x5 SASS/SCSS
安装依赖:
yarn add sass-loader sass css-loader style-loader -D
config/webpack.dev.js
添加规则:
entry: {
index: [
'./src/js/index.js',
'./src/scss/index.scss'
]
},
module: {
rules: [
{
test: /\.scss$/i,
use: [
// 将 JS 字符串生成为 style 节点
'style-loader',
// 将 CSS 转化成 CommonJS 模块
'css-loader',
// 将 Sass 编译成 CSS
{
loader: "sass-loader",
options: {
sourceMap: true,
}
}
],
}
]
}
0x6 PostCSS
yarn add postcss-loader postcss autoprefixer -D
在上面规则修改
module: {
rules: [
{
test: /\.scss$/i,
use: [
'style-loader',
'css-loader',
// => 添加
'postcss-loader',
{
loader: "sass-loader",
options: {
sourceMap: true,
}
}
],
}
]
}
项目目录下新建 postcss.config.js
来添加兼容规则:
module.exports = {
plugins: [
require('autoprefixer')
]
}
0x7 ESLint
安装依赖:
yarn add eslint-webpack-plugin eslint -D
config/webpack.dev.js
添加插件:
const ESLintPlugin = require('eslint-webpack-plugin')
const esLintPlugin = new ESLintPlugin({
emitWarning: true,
emitError: true,
failOnWarning: false,
failOnError: false
})
module.exports = {
plugins: [
esLintPlugin
]
}