webpack
的构建工具?webpack
配置文件可以通过 webpack --config 指定配置文件
默认: webpack.config.js
module.exports = {
entry: './src/index.js', // 入口文件
output: './dist/main.js', // 输出
mode: 'production', // 环境
module:{
rules:[ // Loader 配置
{test:/\.txt$/,use:'raw-loader'}
]
},
plugins:[ // 插件配置
new HtmlwebpackPlugin({
template: './src/index.html'
})
]
};
nvm是让你在同一台机器上安装和切换不同版本的node的工具
github:https://github.com/nvm-sh/nvm
提供两种方式的安装
curl 安装:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.2/install.sh | bash
wget 安装:
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.2/install.sh | bash
命令:
nvm ls-remote:列出所有可以安装的node版本号
nvm install v10.15.3:安装指定版本号的node
nvm use v10.3.0:切换node的版本,这个是全局的
nvm current:当前node版本
nvm ls:列出所有已经安装的node版本
nvm 列出可安装的版本:
nvm ls-remote
找到最新的长期支持版本:v12.14.1 (Latest LTS: Erbium) 截止发稿日
安装:
nvm install v12.14.1
验证:显示版本号即为正确安装
node -v
npm -v
webpack
和 webpack-cli
创建项目:
mkdir wp-demo
进入项目目录:
cd wp-demo
初始化 npm
npm init -y
安装 webpack
和 webpack-cli
:
npm install webpack webpack-cli --save-dev
验证:显示版本号即为正确安装
./node_modules/.bin/webpack -v
在项目文件夹创建以下文件
./webpack.config.js
'use strict';
const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
path: path.join(__dirname, 'dist'),
filename: 'bundle.js'
},
mode: 'production'
};
./src/index.js
import { helloworld } from './helloworld'
document.write(helloworld());
./src/helloworld.js
export function helloworld() {
return 'Hello webpack';
}
./node_modules/.bin/webpack
上面命令有点麻烦,修改 package.json
加入一个npm 脚本命令:
{
"name": "wp-demo",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack" // 添加此行
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"webpack": "^4.41.5",
"webpack-cli": "^3.3.10"
}
}
今后可以通过进行打包:
npm run build
至此,HelloWorld
入门完成。
单入口配置:
module.exports = {
entry: './src/index.js'
};
多入口配置:
module.exports = {
entry: {
app: './src/app.js',
adminApp: './src/adminApp.js'
}
};
module.exports = {
output: {
path: path.join(__dirname, 'dist'),
filename: '[name].js'
}
};
默认只支持 js
、json
两种文件类型,通过 Loaders
去处理其他类型的文件。
名称 | 描述 |
---|---|
babel-loader | 转换 ES6、ES7 等JS新特性的语法 |
css-loader | 支持 .css 文件的加载和解析 |
less-loader | 将 less 文件转换成 css |
ts-loader | 将 TS 文件转换成 css |
file-loader | 进行图片、字体的打包 |
raw-loader | 将文字以字符串形式导入 |
thread-loader | 多线程打包 js 和 css |
用法:
module:{
rules:[
{test:/\.txt$/,use:'raw-loader'}
// test 指定匹配规则
// use 指定使用 loader 的名称
]
}
Mode 指定当前构建环境是:production
、development
还是 none
,默认 production
。
npm i @babel/core @babel/preset-env babel-loader -D
项目根目录添加 .babelrc
文件:
{
"presets": [
"@babel/preset-env"
]
}
babel的配置文件是 .babelrc
,增加:babel Preset
视为 babel Plugin
的插件集合
{
"presets":[
"@babel/preset-env" // 增加 ES6 的 babel preset 配置
],
"plugins":[
"@babel/proposal-class-properties"
]
}
webpack.config.js
module:{
rules:[
{test:/\.js$/,use:'babel-loader'}
]
}
css-loader
用于加载 .css
文件,并转换成 commonjs
对象style-loader
将样式通过 <style>
标签插入到 head
中npm i style-loader css-loader -D
新建 ./search.css
文件并从 .js
文件引入
./src/search.js
import './search.css';
webpack.config.js
module:{
rules:[
{test:/\.js$/,use:'babel-loader'}, // 上面的 ES6
{
test:/\.css$/,
use:[
'style-loader',
'css-loader'
]
}, // 在 style 解析之上
]
}
npm i less less-loader -D
新建 ./search.less
文件并从 .js
文件引入
./src/search.js
import './search.less';
webpack.config.js
module:{
rules:[
{test:/\.js$/,use:'babel-loader'}, // 上面的 ES6
{test:/\.less$/,use:'style-loader','css-loader','less-loader'}, // 在 style、css 解析之上
]
}
npm i file-loader -D
webpack.config.js
module:{
rules:[
{test:/\.(png|svg|jpg|gif)$/,use:'file-loader'},
]
}
./src/search.js
import logo from './images/logo.png'
...
<img src={ logo }>
webpack.config.js
module:{
rules:[
{test:/\.(woff|woff2|eot|ttf|otf)$/,use:'file-loader'},
]
}
./src/base.css
@font-face{
font-family: 'weiruanyahei';
src: url('./images/weruanyahei.ttf')
}
url-loader 也可以处理图片和字体,此外可以设置较小资源自动 base64
图片转换
webpack.config.js
module:{
rules:[
{
test:/\.(woff|woff2|eot|ttf|otf)$/,
use:[{
loader:'url-loader',
options:{
limit:10240 // 图片小于10k,自动转换为 base64
}
}]
},
]
}
在发现源码变化时,自动重新构建出新的输出文件
webpack
命令时,带上 --watch
参数webpack.config.js
中设置 watch:true
package.json
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack",
"watch": "webpack --watch"
},
npm run watch
简称:WDS,优点:
npm i webpack-dev-server -D
package.json
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack",
"watch": "webpack --watch", // 上一节的 watch
"dev": "webpack-dev-server --open" // 新增,--open 构建完成自动开启浏览器
},
webpack.config.js
const webpack = require('webpack');
module.exports = {
...
mode: 'development',
plugins: [
new webpack.HotModuleReplacementPlugin()
],
devServer: {
contentBase: './dist', // 设置目录
hot: true // 开启热更新
}
...
};
打包后输出的文件名的后缀
<script src="//abc.com/css/index_2343481ys.js?_bid=152">
文件指纹如何生成?
Hash值
就会更改entry
会生成不同的 Chunkhash值
Contenthash值
不变npm i mini-css-extract-plugin -D
webpack.prod.js
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
module.exports = {
rules:[
// 图片的文件指纹
{
test:/\.(png|svg|jpg|gif)$/,
use:[{
loader: 'file-loader',
options:{
name: 'img/[name][hash:8].[ext]'
}
}]
},
],
output:{
// 设置 js 的文件指纹
filename:'[name][chunkhash:8].js',
path:__dirname + '/dist'
},
plugins:[
// 设置 css 的文件指纹
new MiniCssExtractPlugin({
filename: '[name][contenthash:8].css'
})
]
}
内置了 uglifyjs-webpack-plugin
,默认 production模式
自动压缩
使用 optimize-css-assets-webpack-plugin
,同时使用 cssnano
。
npm i optimize-css-assets-webpack-plugin -D
npm i cssnano -D
npm i html-webpack-plugin -D
webpack.prod.js
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
plugins: [
// css 压缩
new OptimizeCSSAssetsPlugin({
assetNameRegExp: /\.css$/g,
cssProcessor: require('cssnano')
}),
// HTML 压缩
new HtmlWebpackPlugin({
template: path.join(__dirname, 'src/index.html'),
filename: 'index.html',
chunks: ['index'],
inject: true,
minify: {
html5: true,
collapseWhitespace: true,
preserveLineBreaks: false,
minifyCSS: true,
minifyJS: true,
removeComments: false
}
}),
]
}
插件:clean-webpack-plugin
npm i clean-webpack-plugin -D
webpack.prod.js 和 webpack.dev.js
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
module.exports = {
plugins: [
new CleanWebpackPlugin()
],
}
插件:autoprefixer
npm i postcss-loader autoprefixer -D
{
test: /\.(sc|c|sa)ss$/,
use: [
MiniCssExtractPlugin.loader,
'css-loader',
{
loader: 'postcss-loader',
options: {
plugins: () => [
require('autoprefixer')({
overrideBrowserslist:['last 2 version', '>1%', 'ios 7']
})
]
}
}
],
include: /src/,
},
<!-- > 插件 px2rem-loader -->
<!-- `
bash
npm i px2rem-loader -D
lib-flexible 库,现已停止
npm i lib-flexible -S
'css-loader',
{
loader: 'px2rem-loader',
options: {
remUnit: 75,
remPrecision: 8
}
}
加入下一章节的资源内联
# 21、资源内联
> 插件:raw-loader@0.5.1
npm i raw-loader@0.5.1 -D
上一章节 `index.html` 加入下面代码块:
<head>
${ require('raw-loader!./meta.html') }
<title>index</title>
<script>${ require('raw-loader!babel-loader!../../node_modules/lib-flexible/flexible.js') }</script>
</head>
# 22、source map
>webpack.prod.js
plugins:[
...
],
devtool: 'source-map' // 添加
# 23、Tree Shaking
> 打包后剔除掉没用到的代码。
- WebPack 4.0无需配置
- mode: production 下默认开启
- 依赖 ES6 语法
# 24、Scope Hoisting
> Scope Hoisting 可以让 Webpack 打包出来的代码文件更小、运行的更快,减少函数声明代码和内存开销。
- WebPack 4.0无需配置
- mode: production 下默认开启