学习webpack主要是为了了解目前前端开发的整体流程,实际开发中,我们并不需要去手动配置,因为框架的脚手架都已经帮助我们完成了配置
该模块在Webpack中会经常使用
const path = require("path");
const pathStr = "D:/Mrzhang/Study/前端/node/code/zc_test/src/index.js";
//获取文件的父文件夹
console.log(path.dirname(pathStr)); //D:/Mrzhang/Study/前端/node/code/zc_test/src
//获取文件名
console.log(path.basename(pathStr)); //index.js
//获取扩展名
console.log(path.extname(pathStr));//.js
const path = require("path");
const pathStr1 = "./src/view";
const pathStr2 = "../index.js";
const pathStr3 = "./index.js";
console.log(path.join(pathStr1, pathStr2)); //src\index.js
console.log(path.join(pathStr1, pathStr3)); //src\view\index.js
const path = require("path");
console.log(path.resolve("/src", "/txt.js")); //在"txt.js"就会停止解析 D:\txt.js
console.log(path.resolve("/src", "./txt.js")); // 在"/src"停止解析,D:\src\txt.js
console.log(path.resolve("/src/view", "../txt.js")); //D:\src\txt.js
webpack的中文官方文档 中文文档
npm install webpack webpack-cli
进行局部安装,若有需要可以进行全局安装webpack
命令,Webpack会默认去寻找目录中的 src/index.js文件const path = require("path");
//导出配置信息
//因为webpack基于node,所以使用CommonJS
module.exports = {
//需要对哪个文件进行打包
entry: "./src/main.js",
//打包后的文件名,文件夹名称以及路径
output: {
filename: "bundle.js",
//这里的path需要使用绝对路径,因此需要使用node中的path模块
path: path.resolve(__dirname, "./dist"),
},
};
当我们在命令行输入 npx webpack后
而每次输入 npx webpack会很麻烦,因此,我们可以在 package.json文件中的 scripts属性进行配置
"scripts": {
"build":"webpack"
},
npm run build
进行文件的打包Webpack默认是可以打包js文件的,但是对于其他文件在默认情况下不能进行打包
因此在打包其他文件的时候,需要用到对应文件的loader
css也不例外
npm install css-loader
const path = require("path");
//导出配置信息
//因为webpack基于node,所以使用CommonJS
module.exports = {
entry: "./src/main.js",
output: {
filename: "bundle.js",
//这里的path需要使用绝对路径,因此需要使用node中的path模块
path: path.resolve(__dirname, "./dist"),
},
//在module设置不同文件的loader
module: {
//因为loader会有很多,所以采用数组的方式
rules: [
{
//告诉webpack匹配什么文件
//在后面使用正则表达式
test: /\.css$/,
//使用什么laoder处理,
//使用数组类型,因为一个文件有可能使用多个loader
//css-loader仅是可以识别css文件,并不能将样式添加进去
//style-loader是将样式添加到元素中
//因为先识别css-loader,所以要写在后面
use: [{ loader: "style-loader" }, { loader: "css-loader" }],
},
],
},
};
与处理css文件类似
npm install less-loader
安装less-loaderconst path = require("path");
module.exports = {
entry: "./src/main.js",
output: {
filename: "bundle.js",
path: path.resolve(__dirname, "./dist"),
},
module: {
rules: [
{
test: /\.css$/,
use: [{ loader: "style-loader" }, { loader: "css-loader" }],
},
{
//匹配less文件
test: /\.less$/,
//先对less文件进行解析
//将less文件生成的css进行解析
//最后将样式进行解析
//这是简写
use: ["style-loader", "css-loader", "less-loader"],
},
],
},
};
这是一个工具,可以通过引入插件的方式,将我们写的css,自动做一个浏览器的适配,注意,需要安装相关插件
npm install postcss-loader
安装post-loaderconst path = require("path");
module.exports = {
entry: "./src/main.js",
output: {
filename: "bundle.js",
path: path.resolve(__dirname, "./dist"),
},
module: {
rules: [
{
test: /\.css$/,
use: [{ loader: "style-loader" }, { loader: "css-loader" },{loader:"postcss-loader"}],
},
{
//匹配less文件
test: /\.less$/,
//先对less文件进行解析
//将less文件生成的css进行解析
//最后将样式进行解析
//这是简写
use: ["style-loader", "css-loader", "less-loader"],
},
],
},
};
但是这样引入,并不能实现 css样式浏览器适配的打包,需要安装其余的插件
通过 npm install autoprefixer
安装插件即可
之后对 postcss-loader进行配置
const path = require("path");
module.exports = {
entry: "./src/main.js",
output: {
filename: "bundle.js",
path: path.resolve(__dirname, "./dist"),
},
module: {
rules: [
{
test: /\.css$/,
use: [
{ loader: "style-loader" },
{ loader: "css-loader" },
{
loader: "postcss-loader",
//对某个loader进行单独的配置
options: {
//loader中设置使用的插件
postcssOptions: {
plugins: ["autoprefixer"],
},
},
},
],
},
{
test: /\.less$/,
use: ["style-loader", "css-loader", "less-loader"],
},
],
},
};
同时 postcss-loader的配置可以单独使用一个文件
创建 postcss.config.js
module.exports = {
plugis: ["autoprefixer"],
};
//在webpack.config.js文件中,直接使用loader:"postcss-loader"即可
上面我们用到了postcss的一个插件,而postcss-preset-env是将常用的插件集成到了一起
npm install postcss-preset-env
安装插件module.exports = {
plugis: ["post-preset-env"],
};
在webpack环境中,每一个文件都是模块,只需要引入模块即可
import testImg from “./img/test.jpg”;
在webpack5之前对图片资源进行打包的时候,是需要安装一些loader的,raw-loader url-loader file-laoder
在webpack5之后,我们可以直接使用 **资源模块类型(asset module type)**来替代上面的loader,即不用单独安装以上的loader
我们仅需在 webpack.config.js的module属性中完成配置即可
const path = require("path");
module.exports = {
entry: "./src/main.js",
output: {
filename: "bundle.js",
path: path.resolve(__dirname, "./dist"),
},
module: {
rules: [
{
test: /\.css$/,
use: ["style-loader", "css-loader", "postcss-loader"],
},
{
test: /\.less$/,
use: ["style-loader", "css-loader", "less-loader", "postcss-loader"],
},
//对图片资源进行打包设置
{
test: /\.(png|jpe?g|svg)/,
type: "asset",
},
],
},
};
在上面的配置中,我们设置了type:asset
type的类型有以下设置
asset/resource:使用该设置,会将图片打包成单独的单独的文件,放在dist文件夹中,通过url进行引入
const path = require("path");
module.exports = {
entry: "./src/main.js",
output: {
filename: "bundle.js",
path: path.resolve(__dirname, "./dist"),
},
module: {
rules: [
{
test: /\.css$/,
use: ["style-loader", "css-loader", "postcss-loader"],
},
{
test: /\.less$/,
use: ["style-loader", "css-loader", "less-loader", "postcss-loader"],
},
//对图片资源进行打包设置
{
test: /\.(png|jpe?g|svg)/,
type: "asset",
//设置多大的图片会进行base64编码
parser: {
dataUrlCondition: {
//单位是byte,60*1024代表60kb
//60kb之前会生成base64编码
//大于60kb会打包成单独的文件
maxSize: 60 * 1024,
},
},
},
],
},
};
const path = require("path");
module.exports = {
entry: "./src/main.js",
output: {
filename: "bundle.js",
path: path.resolve(__dirname, "./dist"),
},
module: {
rules: [
{
test: /\.css$/,
use: ["style-loader", "css-loader", "postcss-loader"],
},
{
test: /\.less$/,
use: ["style-loader", "css-loader", "less-loader", "postcss-loader"],
},
//对图片资源进行打包设置
{
test: /\.(png|jpe?g|svg)/,
type: "asset",
//设置多大的图片会进行base64编码
parser: {
dataUrlCondition: {
maxSize: 60 * 1024,
},
},
generator: {
//占位符
//name:源文件名
//ext:文件名的后缀.png .jpg
//hash:webpack生成的hash
//前面可以加上路径,代表打包之后,放到哪个文件夹中
filename: "img/[name]_[hash][ext]",
},
},
],
},
};
我们知道,webpack默认会对js文件进行打包的,但是仅仅是将代码进行压缩以及丑化
并不能将ES5+的代码转换成ES5的代码,保持浏览器的兼容
因此这时候需要用到babel工具
npm install babel-loader
安装Babel工具常见的预设有三个env react TypeScript
npm install @babel/preset-env
module.exports = {
presets: ["@babel/preset-env"],
};
const path = require("path");
module.exports = {
entry: "./src/main.js",
output: {
filename: "bundle.js",
path: path.resolve(__dirname, "./dist"),
},
module: {
rules: [
{
//对js文件使用babel-loader工具
test: /\.js/,
//会自动去寻找babel.config.js中的设置
use: ["babel-loader"],
},
{
test: /\.css$/,
use: ["style-loader", "css-loader", "postcss-loader"],
},
{
test: /\.less$/,
use: ["style-loader", "css-loader", "less-loader", "postcss-loader"],
},
//对图片资源进行打包设置
{
test: /\.(png|jpe?g|svg)/,
type: "asset",
parser: {
dataUrlCondition: {
maxSize: 60 * 1024,
},
},
generator: {
filename: "img/[name]_[hash][ext]",
},
},
],
},
};
import {name} from “./until”
import {name} from “./until.js”
const path = require("path");
module.exports = {
entry: "./src/main.js",
output: {
filename: "bundle.js",
path: path.resolve(__dirname, "./dist"),
},
//对文件会自动进行添加后缀
//即我们写出import {name} from "./until"这样的代码,会在until后面自动拼接extensions数组里面的内容
resolve: {
extensions: [".js", ".json", ".jsx", ".vue"],
alias: {
//最好使用绝对路径
//现在 /untils就代表了.src/untils
utils: path.resolve(__dirname, ".src/untils"),
},
},
module: {
rules: [
],
},
};
当我们修改了代码,重新打包的时候,需要手动的清除dist,再重新打包才是最新的
我们可以借助 CleanWebpackPlugin插件,完成手动清除dist文件夹的操作
首先,我们先安装此插件 npm install clean-webpack-plugin -D
在 webpack.config.js文件中完成配置即可
const path = require("path");
//引入插件
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
module.exports = {
entry: "./src/main.js",
output: {
filename: "bundle.js",
path: path.resolve(__dirname, "./dist"),
},
//使用插件
plugins: [new CleanWebpackPlugin()],
resolve: { },
module: {
rules: [],
},
};
在之前的学习中,当我们打包一个项目,生成的dist文件中并没有html文件,此插件的目的就是自动生成一个html文件
npm install html-webpack-plugin -D
安装此插件const path = require("path");
//引入插件
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = {
entry: "./src/main.js",
output: {
filename: "bundle.js",
path: path.resolve(__dirname, "./dist"),
},
//使用插件
plugins: [
new CleanWebpackPlugin(),
new HtmlWebpackPlugin({
title: "zhangcheng",
//自己引用模板的路径
// template: "相对路径",
}),
],
resolve: { },
module: {
rules: [],
},
};
此插件已经集成到了 webpack中,因此我们直接引入即可
process.env.NODE_ENV
用于区分开发环境和生成环境的const path = require("path");
//引入插件
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const { DefinePlugin } = require("webpack");
module.exports = {
entry: "./src/main.js",
output: {
filename: "bundle.js",
path: path.resolve(__dirname, "./dist"),
},
//使用插件
plugins: [
new CleanWebpackPlugin(),
new HtmlWebpackPlugin({
title: "zhangcheng",
//自己引用模板的路径
// template: "相对路径",
}),
new DefinePlugin({
//使用key:value形式
//value中会当成js代码
counter: "1+1", //2
counterStr: "'1+1'", //1+1字符串
}),
],
resolve: { },
module: {
rules: [],
},
};
const path = require("path");
module.exports = {
//Mode配置项
mode:"development"
entry: "./src/main.js",
output: {
filename: "bundle.js",
path: path.resolve(__dirname, "./dist"),
},
//使用插件
plugins: [
new CleanWebpackPlugin(),
new HtmlWebpackPlugin({
title: "zhangcheng",
//自己引用模板的路径
// template: "相对路径",
}),
new DefinePlugin({
//使用key:value形式
//value中会当成js代码
counter: "1+1", //2
counterStr: "'1+1'", //1+1字符串
}),
],
resolve: { },
module: {
rules: [],
},
};
前面的学习中,我们编写完成代码后,需要手动执行build命令,完成项目的打包,效率会很低
通过Webpack搭建一个本地的服务器,代码发生变化的时候,就自动打包,并刷新浏览器
需要借助webpack-dev-server来完成以上操作
首先通过 npm install webpack-dev-server -D
安装 webpack-dev-server
在package.json文件的scripts中增加相应的脚本
"scripts": {
"build": "webpack",
"serve": "webpack serve"
},
之后运行 npm run serve
即可
实际上webpack-dev-server会将代码打包到内存中,之后开启一个服务器,浏览器访问本地的服务器读取内存中的代码,并不会生成本地的文件
当我们只对某个模块发生了改变,则只会对改变的模块进行替换,添加以及删除等操作,从而无需刷新整个页面
HMR通过一下几种方式,来提高开发的效率
目前webpack是默认开启HMR的
devServer:{
hot:true
}
在代码中,我们需要指定哪些模块发生变化时,进行HMR
//判断是否开启了HMR
if(module.hot){
module.hot.accept("./until.js",()=>{
console.log("更新了")
})
}
devServer:{
hot:true,
//修改端口号
port:8888
//修改主机
host:"0.0.0.0"
//自动打开浏览器
open:true
//是否对文件进行压缩
compress:true
}