国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁 > 營銷資訊 > 網(wǎng)站運營 > Webpack基礎(chǔ)應(yīng)用篇-[13] 1.10 拆分開發(fā)環(huán)境和生產(chǎn)環(huán)境配置

Webpack基礎(chǔ)應(yīng)用篇-[13] 1.10 拆分開發(fā)環(huán)境和生產(chǎn)環(huán)境配置

時間:2023-05-28 23:45:01 | 來源:網(wǎng)站運營

時間:2023-05-28 23:45:01 來源:網(wǎng)站運營

Webpack基礎(chǔ)應(yīng)用篇-[13] 1.10 拆分開發(fā)環(huán)境和生產(chǎn)環(huán)境配置:現(xiàn)在,我們只能手工的來調(diào)整 mode選項,實現(xiàn)生產(chǎn)環(huán)境和開發(fā)環(huán)境的切換,且很多配置在生產(chǎn)環(huán)境和開發(fā)環(huán)境中存在不一致的情況,比如開發(fā)環(huán)境沒有必要設(shè)置緩存,生產(chǎn)環(huán)境還需要設(shè)置公共路徑等等。

本節(jié)介紹拆分開發(fā)環(huán)境和生產(chǎn)環(huán)境,讓打包更靈活。

1.10.1 公共路徑

publicPath 配置選項在各種場景中都非常有用。你可以通過它來指定應(yīng)用程序中所有資源的基礎(chǔ)路徑。

import webpack from 'webpack';// 嘗試使用環(huán)境變量,否則使用根路徑const ASSET_PATH = process.env.ASSET_PATH || '/';export default { output: { publicPath: ASSET_PATH, }, plugins: [ // 這可以幫助我們在代碼中安全地使用環(huán)境變量 new webpack.DefinePlugin({ 'process.env.ASSET_PATH': JSON.stringify(ASSET_PATH), }), ],};11-multiple-env/webpack.config.js

//...import webpack from 'webpack';// 嘗試使用環(huán)境變量,否則使用根路徑const ASSET_PATH = process.env.ASSET_PATH || '/';export default {output: { //... publicPath: ASSET_PATH,},plugins: [ // 這可以幫助我們在代碼中安全地使用環(huán)境變量 new webpack.DefinePlugin({ 'process.env.ASSET_PATH': JSON.stringify(ASSET_PATH), }), //... ],};

Automatic publicPath

有可能你事先不知道 publicPath 是什么,webpack 會自動根據(jù) import.meta.urldocument.currentScript、script.src 或者 self.location 變量設(shè)置 publicPath。你需要做的是將 output.publicPath 設(shè)為 'auto'

module.exports = { output: { publicPath: 'auto', },};請注意在某些情況下不支持 document.currentScript,例如:IE 瀏覽器,你不得不引入一個 polyfill,例如 currentScript Polyfill

1.10.2 環(huán)境變量

想要消除 webpack.config.js 在 開發(fā)環(huán)境 和 生產(chǎn)環(huán)境 之間的差異,你可能需要環(huán)境變量(environment variable)。

webpack 命令行 環(huán)境配置 的 --env 參數(shù),可以允許你傳入任意數(shù)量的環(huán)境變量。而在 webpack.config.js 中可以訪問到這些環(huán)境變量。例如,--env production--env goal=local

npx webpack --env goal=local --env production --progress對于我們的 webpack 配置,有一個必須要修改之處。通常,module.exports 指向配置對象。要使用 env 變量,你必須將 module.exports 轉(zhuǎn)換成一個函數(shù):

11-multiple-env/webpack.config.js

//...module.exports = (env) => {return {//...// 根據(jù)命令行參數(shù) env 來設(shè)置不同環(huán)境的 modemode: env.production ? 'production' : 'development',//...}}

1.10.3 拆分配置文件

目前,生產(chǎn)環(huán)境和開發(fā)環(huán)境使用的是一個配置文件,我們需要將這兩個文件單獨放到不同的配置文件中。如webpack.config.dev.js(開發(fā)環(huán)境配置)和 webpack.config.prod.js(生產(chǎn)環(huán)境配置)。在項目根目錄下創(chuàng)建一個配置文件夾 config 來存放他們。

webpack.config.dev.js 配置如下:

11-multiple-env/config/webpack.config.dev.js

const path = require('path')const HtmlWebpackPlugin = require('html-webpack-plugin')const MiniCssExtractPlugin = require('mini-css-extract-plugin')const toml = require('toml')const yaml = require('yaml')const json5 = require('json5')module.exports = {entry: {index: './src/index.js',another: './src/another-module.js'},output: {filename: 'scripts/[name].js',path: path.resolve(__dirname, './dist'),clean: true,assetModuleFilename: 'images/[contenthash][ext]'},mode: 'development',devtool: 'inline-source-map',plugins: [new HtmlWebpackPlugin({ template: './index.html', filename: 'app.html', inject: 'body'}),new MiniCssExtractPlugin({ filename: 'styles/[contenthash].css'})],devServer: {static: './dist'},module: {rules: [ { test: //.png$/, type: 'asset/resource', generator: { filename: 'images/[contenthash][ext]' } }, { test: //.svg$/, type: 'asset/inline' }, { test: //.txt$/, type: 'asset/source' }, { test: //.jpg$/, type: 'asset', parser: { dataUrlCondition: { maxSize: 4 * 1024 * 1024 } } }, { test: //.(css|less)$/, use: [MiniCssExtractPlugin.loader, 'css-loader', 'less-loader'] }, { test: //.(woff|woff2|eot|ttf|otf)$/, type: 'asset/resource' }, { test: //.(csv|tsv)$/, use: 'csv-loader' }, { test: //.xml$/, use: 'xml-loader' }, { test: //.toml$/, type: 'json', parser: { parse: toml.parse } }, { test: //.yaml$/, type: 'json', parser: { parse: yaml.parse } }, { test: //.json5$/, type: 'json', parser: { parse: json5.parse } }, { test: //.js$/, exclude: /node_modules/, use: { loader: 'babel-loader', options: { presets: ['@babel/preset-env'], plugins: [ [ '@babel/plugin-transform-runtime' ] ] } } }]},optimization: {splitChunks: { cacheGroups: { vendor: { test: /[///]node_modules[///]/, name: 'vendors', chunks: 'all' } }}}}webpack.config.prod.js 配置如下:

11-multiple-env/config/webpack.config.prod.js

const path = require('path')const HtmlWebpackPlugin = require('html-webpack-plugin')const MiniCssExtractPlugin = require('mini-css-extract-plugin')const CssMinimizerPlugin = require('css-minimizer-webpack-plugin')const toml = require('toml')const yaml = require('yaml')const json5 = require('json5')module.exports = {entry: {index: './src/index.js',another: './src/another-module.js'},output: {filename: 'scripts/[name].[contenthash].js',// 打包的dist文件夾要放到上一層目錄path: path.resolve(__dirname, '../dist'),clean: true,assetModuleFilename: 'images/[contenthash][ext]',publicPath: 'http://localhost:8080/'},mode: 'production',plugins: [new HtmlWebpackPlugin({ template: './index.html', filename: 'app.html', inject: 'body'}),new MiniCssExtractPlugin({ filename: 'styles/[contenthash].css'})],module: {rules: [ { test: //.png$/, type: 'asset/resource', generator: { filename: 'images/[contenthash][ext]' } }, { test: //.svg$/, type: 'asset/inline' }, { test: //.txt$/, type: 'asset/source' }, { test: //.jpg$/, type: 'asset', parser: { dataUrlCondition: { maxSize: 4 * 1024 * 1024 } } }, { test: //.(css|less)$/, use: [MiniCssExtractPlugin.loader, 'css-loader', 'less-loader'] }, { test: //.(woff|woff2|eot|ttf|otf)$/, type: 'asset/resource' }, { test: //.(csv|tsv)$/, use: 'csv-loader' }, { test: //.xml$/, use: 'xml-loader' }, { test: //.toml$/, type: 'json', parser: { parse: toml.parse } }, { test: //.yaml$/, type: 'json', parser: { parse: yaml.parse } }, { test: //.json5$/, type: 'json', parser: { parse: json5.parse } }, { test: //.js$/, exclude: /node_modules/, use: { loader: 'babel-loader', options: { presets: ['@babel/preset-env'], plugins: [ [ '@babel/plugin-transform-runtime' ] ] } } }]},optimization: {minimizer: [ new CssMinimizerPlugin()],splitChunks: { cacheGroups: { vendor: { test: /[///]node_modules[///]/, name: 'vendors', chunks: 'all' } }}},//關(guān)閉 webpack 的性能提示performance: {hints:false}}拆分成兩個配置文件后,分別運行這兩個文件:

開發(fā)環(huán)境:

[felix] 10-multiple-env $ npx webpack serve -c ./config/webpack.config.dev.js生產(chǎn)環(huán)境:

[felix] 10-multiple-env $ npx webpack -c ./config/webpack.config.prod.js

1.10.4 npm 腳本

每次打包或啟動服務(wù)時,都需要在命令行里輸入一長串的命令。我們將父目錄的 package.json、node_modulespackage-lock.json拷貝到當(dāng)前目錄下,

配置 npm 腳本來簡化命令行的輸入,這時可以省略 npx

11-multiple-env/package.json

{"scripts": {"start": "webpack serve -c ./config/webpack.config.dev.js","build": "webpack -c ./config/webpack.config.prod.js"}}開發(fā)環(huán)境運行腳本:

[felix] 10-multiple-env $ npm run start


[felix] 10-multiple-env $ npm run build

1.10.5 提取公共配置

這時,我們發(fā)現(xiàn)這兩個配置文件里存在大量的重復(fù)代碼,可以手動的將這些重復(fù)的代碼單獨提取到一個文件里,

創(chuàng)建 webpack.config.common.js,配置公共的內(nèi)容:

11-multiple-env/config/webpack.config.common.js

const path = require('path')const HtmlWebpackPlugin = require('html-webpack-plugin')const MiniCssExtractPlugin = require('mini-css-extract-plugin')const toml = require('toml')const yaml = require('yaml')const json5 = require('json5')module.exports = {entry: {index: './src/index.js',another: './src/another-module.js'},output: {// 注意這個dist的路徑設(shè)置成上一級path: path.resolve(__dirname, '../dist'),clean: true,assetModuleFilename: 'images/[contenthash][ext]',},plugins: [new HtmlWebpackPlugin({ template: './index.html', filename: 'app.html', inject: 'body'}),new MiniCssExtractPlugin({ filename: 'styles/[contenthash].css'})],module: {rules: [ { test: //.png$/, type: 'asset/resource', generator: { filename: 'images/[contenthash][ext]' } }, { test: //.svg$/, type: 'asset/inline' }, { test: //.txt$/, type: 'asset/source' }, { test: //.jpg$/, type: 'asset', parser: { dataUrlCondition: { maxSize: 4 * 1024 } } }, { test: //.(css|less)$/, use: [MiniCssExtractPlugin.loader, 'css-loader', 'less-loader'] }, { test: //.(woff|woff2|eot|ttf|otf)$/, type: 'asset/resource' }, { test: //.(csv|tsv)$/, use: 'csv-loader' }, { test: //.xml$/, use: 'xml-loader' }, { test: //.toml$/, type: 'json', parser: { parse: toml.parse } }, { test: //.yaml$/, type: 'json', parser: { parse: yaml.parse } }, { test: //.json5$/, type: 'json', parser: { parse: json5.parse } }, { test: //.js$/, exclude: /node_modules/, use: { loader: 'babel-loader', options: { presets: ['@babel/preset-env'], plugins: [ [ '@babel/plugin-transform-runtime' ] ] } } }]},optimization: {splitChunks: { cacheGroups: { vendor: { test: /[///]node_modules[///]/, name: 'vendors', chunks: 'all' } }}},//關(guān)閉 webpack 的性能提示performance: {hints:false}}改寫 webpack.config.dev.js:

11-multiple-env/config/webpack.config.dev.js

module.exports = {// 開發(fā)環(huán)境不需要配置緩存output: {filename: 'scripts/[name].js',},// 開發(fā)模式mode: 'development',// 配置 source-mapdevtool: 'inline-source-map',// 本地服務(wù)配置devServer: {static: './dist'}}修改 webpack.config.prod.js:

11-multiple-env/config/webpack.config.prod.js

const CssMinimizerPlugin = require('css-minimizer-webpack-plugin')module.exports = {// 生產(chǎn)環(huán)境需要緩存output: {filename: 'scripts/[name].[contenthash].js',publicPath: 'http://localhost:8080/'},// 生產(chǎn)環(huán)境模式mode: 'production',// 生產(chǎn)環(huán)境 css 壓縮optimization: {minimizer: [ new CssMinimizerPlugin()]}}1.10.6 合并配置文件

配置文件拆分好后,新的問題來了,如何保證配置合并沒用問題呢?webpack-merge 這個工具可以完美解決這個問題。

安裝 webpack-merge:

[felix] felixcourses $ npm install webpack-merge -D創(chuàng)建 webpack.config.js,合并代碼:

11-multiple-env/config/webpack.config.js

const { merge } = require('webpack-merge')const commonConfig = require('./webpack.config.common.js')const productionConfig = require('./webpack.config.prod.js')const developmentConfig = require('./webpack.config.dev')module.exports = (env) => {switch(true) {case env.development: return merge(commonConfig, developmentConfig)case env.production: return merge(commonConfig, productionConfig)default: throw new Error('No matching configuration was found!');}}---本章完---

關(guān)鍵詞:環(huán)境,配置,生產(chǎn),基礎(chǔ)

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點擊下載Chrome瀏覽器
關(guān)閉