Webpack 一开始只认识 JavaScript,当引入其他语言(如:css)撰写的档案时就会出现无法执行的错误,这时候就需要 loader 来解决这个问题,loader 就像是个翻译员一样,让 Webpack 认识不同的档案类型并且执行打包工作。
webpack.config.js 是 Webpack 环境设定的重要档案,在 Day14 里已经学到如何设置 entry(进入点)、output(输出点)、mode(输出模式),今天会在学习让 HTML、CSS 回归的同时,学会 webpack.config.js 的nodule 和 plugins 设定。
接续 Day14 的练习,Webpack 专案的进入点是 src/index.js,表示 Webpack 只会对 src 资料夹底下的 index.js 做加工处理,如果要加入 css,就需要用 import 的方式进行,步骤如下:
src
资料夹内新增 css 档案,命名为 all.css
(名称可自行定义),并加入一些简单的样式语法。
h1 { color: red;}
index.js
的上方引入 css 档案。
import './all.css'
完成後执行build
会得到错误资讯,表示这时候 Webpack 还无法看懂 css,这时候就要设置 loader 了。
You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file.
到 Webpack 官方文件搜寻 css-loader 就能找到相关资讯。
安装 css-loader 和 style-loader(用来将样式插入html中)
$ npm i -D css-loader style-loader
编辑 webpack.config.js,加入模组:
module.exports = {
module: {
rules: [
{
// 用正则表示法来处理副档名是 .css 的档案
test: /\.css$/i,
use: ["style-loader", "css-loader"],
},
],
},
};
程序码插入位置参考图:
完成上面的设置之後,就能成功执行build
。
在上个段落中,虽然让 Webpack 可以认识 CSS,但是打包後的 css 会被写在 js 档案里面,如果希望将 css 独立出来就要使用到插件-MiniCssExtractPlugin
安装 MiniCssExtractPlugin
$ npm i -D mini-css-extract-plugin
建立一个来源的 css 档(这边使用上个段落建立的 all.css,可自行更改)
在输入点的 js 档引用这个 css 档(同样套用上个段落的设定)
编辑 webpack.config.js
// 这行放最上面
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
module.exports = {
// 加入插件
plugins: [new MiniCssExtractPlugin()],
module: {
rules: [
{
test: /\.css$/i,
// 这边原本使用的是 style.loader,变更为 MiniCssExtractPlugin.loader
use: [MiniCssExtractPlugin.loader, "css-loader"],
},
],
},
};
完成设置後执行build
会发现 dist 资料夹内多了 main.css 档案,和 js 档案分开了。
完成 css 的设置後,Webpack 并不会生成 html 让我们检视样式效果,这时候可以安装 HtmlWebpackPlugin 这个插件,在每次 build 後就会生成一个 html 档案来引入输出的 js 档。
安装 HtmlWebpackPlugin
$ npm i -D html-webpack-plugin
编辑 webpack.config.js,加入插件:
// 这行放在最上方
const HtmlWebpackPlugin = require('html-webpack-plugin');
...
...
module.exports = {
// 这行放在 module.exports 内
plugins: [new HtmlWebpackPlugin()],
// 注意,plugins属性里面放的是阵列,如果有在上一个段落加入 mini-css-extract-plugin,撰写方式会如同下面
plugins: [
new HtmlWebpackPlugin(),
new MiniCssExtractPlugin()
],
完成设置後执行build
会发现 dist 资料夹内多了 index.html 档案,并且已经引入了输出的 js 档案。
在前个段落的 html 是 HtmlWebpackPlugin 自动生成的,除了引用 js 之外没有任何内容,我们可以修改 webpack.config.js,把自己撰写的 HTML 作为样板:
module.exports = {
// 在 HtmlWebpackPlugin() 里面放入物件,并设置 template 属性为来源档案路径
plugins: [new HtmlWebpackPlugin({
template: './src/index.html'
})],
};
build
产生的 index.html 就会套用自己撰写的 html 样板了。浏览器有快取机制来节省流量、加快载入速度,每次打包输出的档案都相同,即使部署上线了也会因为快取让用户端继续使用旧的版本,我们可以在每次输出的档案添加一串 hash 值,这样用户端在读取网页时读到不同的档名就会下载最新的档案,不会使用快取。
HTML - 修改 webpack.config.js 的 output(输出点)
module.exports = {
output: {
path: path.resolve(__dirname, 'dist'),
// 下方这行加入了 [hash]
filename: 'bundle.[hash].js',
},
};
CSS - 修改 webpack.config.js 的 html-webpack-plugin 插件设定
plugins: [
// 小括弧内加入一个物件来设定输出档名
new MiniCssExtractPlugin({
filename: 'main.[hash].css'
})
],
再次执行build
会发现输出的档案多了一串 hash。(这个设定需要搭配插件来帮忙引入新的档案名称,没有使用插件的话每次 build 完要自己改引用路径,会非常麻烦)
完成上个段落的 hash 设置後,因为每次产生的档名都不同,就不会有『覆盖』的行为,多 build 几次後 dist 资料夹里面会变得很乱,可以透过 clean-webpack-plugin 这个套件在每次 build 的时候清理 dist 资料夹。
安装套件
$ npm i -D clean-webpack-plugin
编辑 webpack.config.js
// 插入最上方
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
...
// 插入 plugins
plugins: [
new CleanWebpackPlugin(),
],
完成设定後就可以测试成果了。
今天的练习,学到了 webpack.config.js 的两个配置,loader
可以让 Webpack 读懂新的档案格式,plugin
可以让 Webpack 自动化执行特定的操作。
<<: 2.2 Design System - 设计语言 (9/24 updated)
>>: [常见的自然语言处理技术] 文本相似度(IV): 建立自己的Word2vec模型
Categorical Encoding Encoding Describe One hot enc...
今天开始要介绍 Structural patterns。先前的 Creational pattern...
在每个要求你注册会员的新网站,都必须要想一组莫名复杂的密码,不但长度要够长、更要包含一堆有的没的字元...
Quicksort- Tony Hoare - 1962 和merge-sort一样,他使用了Div...
距离完赛只剩下5天,赞。 还没有开始主题的内容,毕竟要学的太多了,就慢慢地学吧。 在开始之前,跟大家...