loader的使用
因为 Webpack 不原生支持解析 CSS 文件。要支持非 JavaScript 类型的文件,需要使用 Webpack 的 Loader 机制。
Webpack的配置内loader的使用:配置里的 module.rules 数组配置了一组规则,告诉 Webpack 在遇到哪些文件时使用哪些 Loader 去加载和转换。 如下面配置,告诉 Webpack 在遇到以 .css 结尾的文件时先使用 css-loader 读取 CSS 文件,再交给 style-loader 把 CSS 内容注入到 JavaScript 里。
- use 属性的值需要是一个由 Loader 名称组成的数组,Loader 的执行顺序是由后到前的;
const path = require('path');
module.exports = {
// JavaScript 执行入口文件
entry: './main.js',
output: {
// 把所有依赖的模块合并输出到一个 bundle.js 文件
filename: 'bundle.js',
// 输出文件都放到 dist 目录下
path: path.resolve(__dirname, './dist'),
},
module: {
rules: [
{
test: /\.css$/, // 用正则去匹配要用该 loader 转换的 CSS 文件
use: ['style-loader', 'css-loader'],
}
]
}
};
- 还可以通过 Object 传入一些参数到loader中,以上的 Loader 配置可以修改为如下:
module: {
rules: [
{
// 用正则去匹配要用该 loader 转换的 CSS 文件
test: /\.css$/,
use: [
'style-loader',
{
loader:'css-loader',
options:{
url: true,
}
}
],
}
]
}
- 在重新执行 Webpack 构建前要先安装新引入的 Loader:npm i -D style-loader css-loader
plugin的使用
Plugin 是用来扩展 Webpack 功能的,通过在构建流程里注入钩子实现,它给 Webpack 带来了很大的灵活性。
在上一节中通过 Loader 加载了 CSS 文件,本节将通过 Plugin 把注入到 bundle.js 文件里的 CSS 提取到单独的文件中,配置修改如下:
要让代码运行起来,需要先安装新引入的插件:npm i -D extract-text-webpack-plugin
const path = require('path');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
module.exports = {
// JavaScript 执行入口文件
entry: './main.js',
output: {
// 把所有依赖的模块合并输出到一个 bundle.js 文件
filename: 'bundle.js',
// 把输出文件都放到 dist 目录下
path: path.resolve(__dirname, './dist'),
},
module: {
rules: [
{
// 用正则去匹配要用该 loader 转换的 CSS 文件
test: /\.css$/,
use: ExtractTextPlugin.extract({
// 转换 .css 文件需要使用的 Loader
use: ['css-loader'],
}),
}
]
},
plugins: [
new ExtractTextPlugin({
// 从 .js 文件中提取出来的 .css 文件的名称
filename: `[name]_[contenthash:8].css`,
}),
]
};
其他配置
如resolve
配置:
const path = require('path');
module.exports = {
//...
resolve: {
alias: {
Utilities: path.resolve(__dirname, 'src/utilities/'),
},
},
};
使用:
从 import Utility from '../../utilities/utility';
变成: import Utility from 'Utilities/utility';
还有,本地开发时,http服务如何跑起来的? 在实际开发中,我需要
- 提供 HTTP 服务而不是使用本地文件预览;
- 监听文件的变化并自动刷新网页,做到实时预览;
- 支持 Source Map,以方便调试。
Webpack 原生支持上述第2、3点内容,再结合官方提供的开发工具 DevServer 也可以很方便地做到第1点。DevServer 如何使用,网上搜一下即可,不再赘述