共计 3196 个字符,预计需要花费 8 分钟才能阅读完成。
本系列文章是我在学习 webpack 时的总结与播种,心愿我的一些学习内容能够帮忙到一些正在学习 webpack 的敌人。本片文章为系列文章的第二篇,蕴含 webpack 根底配置与 css 相干 loader
webpack 的应用(01 篇内容补充)
webpack 装置形式:
# 全局装置
npm install webpack webpack-cli -g
# 本地我的项目装置
npm install webpack webpack-cli
如果咱们间接在命令行中执行 webpack
,此时,它默认应用的全局装置的 webpack 以及 webpack-cli,如果没有全局装置这两个货色,则就会报错如下:
$ webpack --config wk.config.js
bash: webpack: command not found
如果在全局也装置了雷同的依赖,那么咱们是能够间接执行该命令的
若想要应用本地我的项目中的 webpack、webpack-cli,有两种形式:
npx webpack --config wk.config.js
:该命令能够间接应用 node_modules/.bin/ 下的可执行文件,应用的就是本地装置的依赖npm run build
:该命令会执行 package.json 文件中 scripts 下的 build 命令,此时会优先应用本地依赖,如果本地依赖不存在,则会应用全局依赖
这一点也解释了很常见的一个面试题:为什么要运行 npm run xxx
,而不间接运行其对应的指令
webpack 配置
webpack 配置文件
webpack 的默认配置文件为:webpack.config.js,放在我的项目的 根目录 下。但其实,webpack(我应用的 webpack5 的版本)提供了三种默认配置文件的写法,均位于我的项目根目录下 , 自上而下优先级递加,如下所示:
- webpack.config.js
- .webpack/webpack.config.js
- .webpack/webpackfile.js
如果不想应用默认配置文件,能够自定义配置文件,在 package.json 中,增加--config 自定义配置文件门路
"scripts": {"build": "webpack --config path"}
在 webpack-cli/lib/webpack-cli.js 中能够查看到相应代码:
if (options.config && options.config.length > 0) {
// 读取自定义配置文件
// options.config 中蕴含自定义配置文件的门路
const loadedConfigs = await Promise.all(options.config.map((configPath) => {return loadConfigByPath(path.resolve(configPath), options.argv)
}
),
);
} else {
// 默认配置文件门路
// Order defines the priority, in decreasing order
const defaultConfigFiles = [
"webpack.config",
".webpack/webpack.config",
".webpack/webpackfile"
]
}
自定义配置文件
webpack 根底配置
这部分内容蕴含 entry、output 以及 module 的简略配置,更为简单的配置例如多入口、hashname 等将在后续文章中逐渐解说
entry:示意打包文件的入口,用 相对路径 示意
module.exports = {
// src 下的 index.js 文件为打包的入口文件
entry: './src/index.js'
}
outptut:打包文件输入配置。输入文件门路 path 是一个 绝对路径
module.exports = {
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, './build')
}
}
module: 次要用来配置 loader 选项,其写法构造如下:
module.exports = {
module: {rules: []
}
}
rules 当中寄存的是 Rule 对象,Rule 对象能够分为三个局部:
- Rule Conditions: 用来匹配对应的文件。例如,应用 test、include、exclude 等联合正则表达式匹配 css、less、jpg 文件
- Rule results: 应用的 loader,罕用的属性有 loader、options、use。use 属性对应一个数组,数组中寄存一个个对象,这些对象就是具体应用的 loader。其中,loader 属性为字符串,options 属性为字符串或对象,其会被传入到 loader 中
- Nested rules: 在属性规定下指定嵌套规定
具体写法有三种:
第一种写法:最残缺的写法
module.exports = {
module: {
rules: [
{
test: /\.css$/, // 应用正则表达式进行匹配
use: [{loader: 'css-loader',options: {}}
]
}
]
}
}
第二种写法:当只有一个 loader 时,能够采取这种简写形式
module.exports = {
module: {
rules: [
{
test: /\.css$/, // 应用正则表达式进行匹配
loader: 'css-loader'
}
]
}
}
第三种写法:省略 loader 属性,间接写 loader 的名称,能够在不配置 options 属性的状况下应用这种简写形式
module.exports = {
module: {
rules: [
{
test: /\.css$/, // 应用正则表达式进行匹配
use: ['css-loader']
}
]
}
}
css 相干 loader 配置
css-loader
css-loader 只用来加载 css 文件,并不会将解析之后的 css 插入到页面,因而,打包之后的 HTML 中款式并不会发生变化
此时,能够看到并没有以 style 标签或行内款式的形式插入 CSS,所以,CSS 不会失效
style-loader
若想要 css-loader 解决后的款式插入到页面中,还须要另外一个 loader, style-loader。style-loader 负责在页面中创立一个 style 标签,并将解决好的款式插入其中,这样咱们能力在页面上看到款式发生变化。
须要留神的是 loader 的执行程序问题。在 webpack 中,当须要多个 loader 时,依照 自下向上 的程序执行
css-loader 用来加载 css 文件,style-loader 将解决好的 css 插入到页面中,因而,css-loader 在 style-loader 之前执行
module.exports = {
rules: [
{
test: /\.css$/,
use: [
'style-loader',
'css-loader'
]
}
]
}
如何解决 less 等 css 预处理文件?
在开发中,常常应用 less、sass、stylus 预处理器来编写 css 款式,那么 如何去反对这些预处理器呢?因而,须要将预处理器款式文件 转为 css 文件,再解决 css 文件
less
npm install less less-loader --save-dev
sass
npm install sass-loader sass webpack --save-dev
留神,真正将 less 文件转为 css 文件的是咱们装置的 less 工具,这个工具与 webpack 没有关系,而 less-loader 会主动调用 less 包,对 less 文件进行解决
执行 npx less ./src/css/component.less > component.css
能够将 less 文件转为 css 文件
less 文件解决配置
module.exports = {
rules: [
{
test: /\.css$/,
use: [
'style-loader',
'css-loader',
'less-loader'
]
}
]
}