携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情
learn webpack
基础配置的复习。本次主要是为了学习webpack各种常见配置以后更加深入的学习。比如webpack工作流,loader chain以及pitch等,plugin机制和流程。后续学习rollup和vite。
basic
基础的配置
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin")
module.exports = {
mode: "development",
// 单个入口
entry: "./src/index.js",
// 输出
output: {
path: path.resolve(__dirname, "dist"),
filename: "bundle.js",
},
// 对模块的处理
module: {
// loader
rules: [
{
test: /\.css$/,
use: ["style-loader", "css-loader"],
},
],
},
// 插件
plugins:[
// html插件
new HtmlWebpackPlugin({
template:path.resolve(__dirname, "public/index.html")
})
]
};
mode
- 开发模式:development
- 生产模式:production
配置方式:
- 直接配置mode字段
- --env指定
{
"build": "webpack --env=development"
}
配置通过函数返回值的形式,是考研在函数参数中拿到env参数的:
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = (env) => {
console.log(env);
return {
mode: env.development ? "development" : "production",
// 单个入口
entry: "./src/index.js",
// 输出
output: {
path: path.resolve(__dirname, "dist"),
filename: "bundle.js",
},
// 对模块的处理
module: {
// loader
rules: [
{
test: /\.css$/,
use: ["style-loader", "css-loader"],
},
],
},
// 插件
plugins: [
// html插件
new HtmlWebpackPlugin({
template: path.resolve(__dirname, "public/index.html"),
}),
],
};
};
取值process.env.NODE_ENV有两个地方:
- 模块文件内
- webpack的配置文件里
该值是可以通过一个插件进行注入,值是任意的。插件是
webpack提供好的。
// 注入环境变量
new DefinePlugin({
"process.env.NODE_ENV": JSON.stringify("development"),
}),
这样在模块内使用该变量的值的时候,就会替换为我们定义的值。
记住:如果使用的是:process.env.NODE_ENV: "development",会替换为development变量,而不是字符串。
但是,如果在配置文件中获取该变量的值,是获取不到的。这个时候我们需要在启动的时候,设置环境变量: win: set NODE_ENV=development mac: export NODE_ENV=development 为了支持跨平台,我们安装一个包:cross-env 这样在配置文件和模块中就可以拿到注入的变量了。可以不通过插件注入同名变量了。如果都设置了同一个变量,我们的插件的优先级更高。
{
"build": "cross-env NODE_ENV=development webpack --env=development"
}
dev server 和 css-loader
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
// 拷贝静态资源到打包目录
const CopyWebpackPlugin = require("copy-webpack-plugin");
const { DefinePlugin } = require("webpack");
module.exports = (env) => {
console.log(env);
console.log(process.env.NODE_ENV);
return {
mode: env.development ? "development" : "production",
// 单个入口
entry: "./src/index.js",
// 输出
output: {
path: path.resolve(__dirname, "dist"),
filename: "bundle.js",
publicPath: "", // 默认是 "" 指定打包后的文件插入html文件时的访问路径前缀
},
// 对模块的处理
module: {
// loader
rules: [
{
test: /\.css$/,
use: [
"style-loader",
{
loader: "css-loader",
// css-loader的配置
options: {
url: true, // 处理url地址 false不处理 需要自己处理
import: true, // false 自己处理import导入
modules: false, // true 表示开启支持 css module 类名会变成hash形式
sourceMap: true, // 生成sourcemap
esModule: true, // true {default: css value} false 直接就是css value
// 允许启用 或者禁用loader 或者设置启用的loader的数量 在css-loader前使用的loader个数
importLoaders: true,
},
},
],
},
{
test: /.\png$/,
// 借助webpack5新特性 资源模块 类似 file-loader
type: "asset/resource",
},
{
// 类似 url-loader 可以把文件变成一个base64字符串 内嵌到html里面
test: /\.ico$/,
type: "asset/inline",
},
{
test: /\.txt$/,
// 类似 raw-loader 不对内容做任何处理
type: "asset/source",
},
{
test: /\.jpg$/,
type: "asset",
parser: {
// 指定内联条件 如果引入的文件体积大于4k的话 就发射文件 小于4k就内联
dataUrlCondition: {
maxSize: 1024 * 4,
},
},
},
],
},
// 插件
plugins: [
// html插件
new HtmlWebpackPlugin({
template: path.resolve(__dirname, "public/index.ejs"),
}),
// 注入环境变量
new DefinePlugin({
// "process.env.NODE_ENV": JSON.stringify("development"),
}),
new CopyWebpackPlugin({
patterns: [
{
from: path.resolve(__dirname, "public"),
to: path.resolve(__dirname, "dist"),
filter: (filepath) => {
console.log("------------------>", filepath);
return !filepath.endsWith("ejs");
},
globOptions: {
ignore: [path.resolve(__dirname, "public/index.ejs")],
},
},
],
}),
],
// 开发服务器
devServer: {
// 额外的 静态资源目录
static: path.resolve(__dirname, "public"),
port: 8080, // 端口号
open: true, // 打包完毕后自动打开浏览器
},
resolve: {
// 别名 访问项目内资源的别名
// 如果想访问 node_modules下面的文件 可以在加载资源路径的时候 采用 ~node module name 开头 后面跟具体资源 css-loader 的功能
alias: {
"@": path.resolve(__dirname, "src"),
},
},
};
};