網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
一、什么是webpack的多進(jìn)程打包
Webpack的多進(jìn)程打包是通過(guò)利用多個(gè)子進(jìn)程同時(shí)處理不同的模塊來(lái)加速打包過(guò)程的技術(shù)。這種技術(shù)可以提高打包效率,減少等待時(shí)間,使得項(xiàng)目構(gòu)建更快。
使用多進(jìn)程打包的好處在于,它可以將一些比較耗時(shí)的操作分配到不同的進(jìn)程中進(jìn)行并行處理,從而提高打包效率。這使得打包過(guò)程更加高效,節(jié)省了時(shí)間和資源。另外,和單進(jìn)程打包相比,多進(jìn)程打包也有助于避免進(jìn)程卡死或異常終止的問(wèn)題。
對(duì)于大型項(xiàng)目或需要進(jìn)行復(fù)雜操作的項(xiàng)目,采用多進(jìn)程打包可以更快地完成項(xiàng)目構(gòu)建,提高效率,減少等待時(shí)間,使開(kāi)發(fā)人員可以更快地檢驗(yàn)代碼。
但是對(duì)于小型項(xiàng)目,比如我這個(gè)學(xué)習(xí)的demo其實(shí)使用多進(jìn)程打包反而會(huì)比單進(jìn)程慢,應(yīng)為沒(méi)多開(kāi)啟一個(gè)進(jìn)程都要耗費(fèi)一定時(shí)間和性能
二,為js和eslint配置多進(jìn)程
我們啟動(dòng)進(jìn)程的數(shù)量就是我們 CPU 的核數(shù)。
1. 獲取 CPU 的核數(shù),因?yàn)槊總€(gè)電腦都不一樣。
// nodejs核心模塊,直接使用
const os = require("os");
// cpu核數(shù)
const threads = os.cpus().length;
2. 下載包
npm i thread-loader -D
3. 核心配置
const os = require('os')
const threads = os.cpus().length
const path = require('path')
const TerserPlugin = require("terser-webpack-plugin");
module.exports = {
entry: './src/main.js',
output: {
path: path.resolve(__dirname, '../dist'),
filename: 'static/js/main.js'
},
module: {
rules: [
{
test: /\.m?js$/, // 轉(zhuǎn)譯哪些文件
exclude: /(node_modules|bower_components)/, // 排除哪些文件夾中的js文件不用轉(zhuǎn)譯
use: [
{
loader: "thread-loader", // 開(kāi)啟多進(jìn)程
options: {
workers: threads, // 數(shù)量
},
},
{
loader: "babel-loader",
options: {
// presets: ['@babel/preset-env'] // 添加預(yù)設(shè),轉(zhuǎn)譯js文件
cacheDirectory: true, // 開(kāi)啟babel編譯緩存
cacheCompression: false, // 緩存文件不要壓縮
},
},
],
},
]
},
plugins: [
new ESLintWebpackPlugin({
// 指定檢查文件的根目錄
context: path.resolve(__dirname, "../src"),
exclude: "node_modules", // 默認(rèn)值
cache: true, // 開(kāi)啟緩存
// 緩存目錄
cacheLocation: path.resolve(
__dirname,
"../node_modules/.cache/.eslintcache"
),
threads, // 開(kāi)啟多進(jìn)程
}),
],
optimization: {
minimize: true,
minimizer: [
// css壓縮也可以寫(xiě)到optimization.minimizer里面,效果一樣的
new CssMinimizerPlugin(),
// 當(dāng)生產(chǎn)模式會(huì)默認(rèn)開(kāi)啟TerserPlugin,但是我們需要進(jìn)行其他配置,就要重新寫(xiě)了
new TerserPlugin({
parallel: threads // 開(kāi)啟多進(jìn)程
})
],
},
}
4. 完整代碼
- webpack.prod.js
// Node.js的核心模塊,專(zhuān)門(mén)用來(lái)處理文件路徑
const path = require("path");
// nodejs核心模塊,直接使用
const os = require("os");
const threads = os.cpus().length;
const ESLintWebpackPlugin = require("eslint-webpack-plugin"); // 引入 ESLint 插件
const HtmlWebpackPlugin = require("html-webpack-plugin"); // 引入 html-webpack-plugin 插件
const MiniCssExtractPlugin = require("mini-css-extract-plugin"); // 引入 mini-css-extract-plugin 插件
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin"); // 壓縮css
const TerserPlugin = require("terser-webpack-plugin");
// 獲取處理樣式的Loaders
const getStyleLoaders = (preProcessor) => {
return [
MiniCssExtractPlugin.loader,
"css-loader",
{
loader: "postcss-loader",
options: {
postcssOptions: {
plugins: [
"postcss-preset-env", // 能解決大多數(shù)樣式兼容性問(wèn)題
],
},
},
},
preProcessor,
].filter(Boolean);
};
module.exports = {
// 入口
// 相對(duì)路徑和絕對(duì)路徑都行
entry: "./src/main.js",
// 輸出
output: {
// path: 文件輸出目錄,必須是絕對(duì)路徑
// path.resolve()方法返回一個(gè)絕對(duì)路徑
// __dirname 當(dāng)前文件的文件夾絕對(duì)路徑
path: path.resolve(__dirname, "../dist"),
// filename: js文件輸出文件名
filename: "js/main.js",
clean: true, // 自動(dòng)將上次打包目錄資源清空
},
// 加載器
module: {
rules: [
{
oneOf: [
{
// 用來(lái)匹配 .css 結(jié)尾的文件
test: /\.css$/,
// use 數(shù)組里面 Loader 執(zhí)行順序是從右到左
use: getStyleLoaders(),
},
{
// 用來(lái)匹配.less結(jié)尾的文件
test: /\.less$/,
use: getStyleLoaders("less-loader"),
},
{
test: /\.s[ac]ss$/,
use: getStyleLoaders("sass-loader"),
},
{
// 用來(lái)匹配圖片文件
test: /\.(png|jpe?g|gif|webp)$/,
type: "asset",
parser: {
dataUrlCondition: {
maxSize: 10 * 1024, // 小于10kb的圖片會(huì)被base64處理
},
},
generator: {
// 將圖片文件輸出到 images 目錄中
// 將圖片文件命名 [hash:8][ext][query]
// [hash:8]: hash值取8位
// [ext]: 使用之前的文件擴(kuò)展名
// [query]: 添加之前的query參數(shù)
filename: "images/[hash:8][ext][query]",
},
},
{
test: /\.(ttf|woff2?|map4|map3|avi)$/,
type: "asset/resource", // 以文件資源的形式輸出
generator: {
filename: "media/[hash:8][ext][query]", // 輸出到media目錄中
},
},
{
test: /\.m?js$/, // 轉(zhuǎn)譯哪些文件
exclude: /(node_modules|bower_components)/, // 排除哪些文件夾中的js文件不用轉(zhuǎn)譯
use: [
{
loader: "thread-loader", // 開(kāi)啟多進(jìn)程
options: {
workers: threads, // 數(shù)量
},
},
{
loader: "babel-loader",
options: {
// presets: ['@babel/preset-env'] // 添加預(yù)設(shè),轉(zhuǎn)譯js文件
cacheDirectory: true, // 開(kāi)啟babel編譯緩存
cacheCompression: false, // 緩存文件不要壓縮
},
},
],
},
],
},
],
},
// 插件
plugins: [
new ESLintWebpackPlugin({
// 指定檢查文件的根目錄
context: path.resolve(__dirname, "../src"),
cache: true, // 開(kāi)啟緩存
// 緩存目錄
cacheLocation: path.resolve(
__dirname,
"../node_modules/.cache/.eslintcache"
),
threads, // 開(kāi)啟多進(jìn)程
}),
new HtmlWebpackPlugin({
// 以 public/index.html 為模板創(chuàng)建文件
// 新的html文件有兩個(gè)特點(diǎn):1. 內(nèi)容和源文件一致 2. 自動(dòng)引入打包生成的js等資源
template: path.resolve(__dirname, "../public/index.html"),
}),
// 提取css成單獨(dú)文件
new MiniCssExtractPlugin({
// 定義輸出文件名和目錄
filename: "css/main.css",
}),
// css壓縮
// new CssMinimizerPlugin(),
],
optimization: {
minimize: true,
minimizer: [
// css壓縮也可以寫(xiě)到optimization.minimizer里面,效果一樣的
new CssMinimizerPlugin(),
// 當(dāng)生產(chǎn)模式會(huì)默認(rèn)開(kāi)啟TerserPlugin,但是我們需要進(jìn)行其他配置,就要重新寫(xiě)了
new TerserPlugin({
parallel: threads // 開(kāi)啟多進(jìn)程
})
],
},
// 模式
mode: "production", // 生產(chǎn)模式
devtool: "source-map", // 生產(chǎn)環(huán)境下使用
};
原文鏈接:https://blog.csdn.net/jieyucx/article/details/131257884
- 上一篇:沒(méi)有了
- 下一篇:沒(méi)有了
相關(guān)推薦
- 2022-04-04 react安裝報(bào)錯(cuò)ReactDOM.render is no longer supported in
- 2022-08-20 docker鏡像alpine中安裝oracle客戶(hù)端_docker
- 2022-06-20 C語(yǔ)言簡(jiǎn)明講解隊(duì)列的實(shí)現(xiàn)方法_C 語(yǔ)言
- 2022-10-29 python實(shí)現(xiàn)k均值聚類(lèi)(kMeans)基于numpy
- 2022-06-24 Python抽象類(lèi)應(yīng)用詳情_(kāi)python
- 2022-04-23 window.open打開(kāi)新窗口設(shè)置顯示位置及大小
- 2022-11-09 css實(shí)現(xiàn)div盒子旋轉(zhuǎn)
- 2022-05-02 Redis使用命令行與多數(shù)據(jù)庫(kù)配置_Redis
- 欄目分類(lèi)
-
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支