Webpack 服務(wù)器端代碼打包的示例代碼
環(huán)境變量
之前,我們在項(xiàng)目里會經(jīng)常使用 process.env.NODE_ENV, 但這個(gè)變量對于 webpack打包是有影響的, 在 production 的時(shí)候是有優(yōu)化的.
所以, 我們將改用其他的環(huán)境變量來區(qū)別:
new webpack.DefinePlugin({
'process.env.NODE_ENV': '"production"',
'process.env.API_ENV': `"${process.env.API_ENV || 'development'}"`
})
像這樣, NODE_ENV 始終為 production.
而我們實(shí)際開發(fā)/產(chǎn)品環(huán)境, 用 process.env.API_ENV 變量來使用(由于該項(xiàng)目是一個(gè) koa 接口服務(wù)項(xiàng)目, 所以這樣進(jìn)行命名, 可以改成任意的, 你開心就好).
動(dòng)態(tài)配置打包
注意
我們以前在 node.js 后端項(xiàng)目中, 動(dòng)態(tài)配置加載一般是這樣寫:
const ENV = process.env.NODE_ENV || 'development';
// eslint-disable-next-line import/no-dynamic-require
const options = require(`./_${ENV}`);
module.exports = options;
為了提高閱讀性, 和可能存在ENV的復(fù)用, 我們會單獨(dú)定義一個(gè)變量.
在 webpack 打包的項(xiàng)目中直接這樣做的話, 會產(chǎn)生一個(gè)問題. 比如我現(xiàn)在有多個(gè)配置:
- _develpment.js
- _test.js
- _production.js
- _staging.js
即便我傳入的當(dāng)前環(huán)境為 development, 依然所有的配置文件會被全部打包進(jìn)來(只是永遠(yuǎn)不會被執(zhí)行). 那么這樣的話, 就存在敏感信息泄露的風(fēng)險(xiǎn).
正確的姿勢應(yīng)該是這樣的:
config/index.js
// eslint-disable-next-line import/no-dynamic-require
const options = require(`./_${process.env.API_ENV || 'development'}`);
module.exports = options;
模塊化打包
比如, 我在項(xiàng)目中有很多個(gè)模塊, 處于負(fù)載均衡的需求, 或者是對于客戶定制模塊化產(chǎn)品的需求, 我們需要分模塊進(jìn)行打包, 避免其他模塊(永遠(yuǎn)不會被執(zhí)行的)被打包進(jìn) webpack bundle.
// config/_development.js exports.enabledModules = ['user', 'demo']; // 可能 src 目錄下 還有其他模塊目錄, 如 'manage' 等
在服務(wù)端加載的時(shí)候, 是這樣子的:
// src/server.js
// 動(dòng)態(tài)加載啟用的模塊
enabledModules.forEach((mod) => {
/* eslint-disable global-require,import/no-dynamic-require */
const routes = require(`./${mod}/route`);
routes.middleware() |> app.use;
});
那么就需要 ContextReplacementPlugin 插件來支持了.
new webpack.ContextReplacementPlugin(/src/, new RegExp(`^./(${enabledModules.join('|')})/.*$`))
進(jìn)階使用
比如,src目錄下除了各個(gè)模塊的目錄, 還有一些通用方法類,鉤子的目錄, 如: lib 和 hook. 這兩個(gè)目錄是可能被其他子模塊共同引用的. 在插件正則中修改:
new webpack.ContextReplacementPlugin(/src/, new RegExp(`^./(lib|hook|${enabledModules.join('|')})/.*$`))
壓縮代碼, 并添加 source-map 支持
Uglifyjs 或 Uglify-es 其實(shí)對于服務(wù)器端代碼打包并不友好, 可能會導(dǎo)致打包的失敗, 用 babel-minify-webpack-plugin 插件來替代.
配合 source-map-support 插件來支持源碼的問題定位.
示例項(xiàng)目源碼: https://github.com/AirDwing/webpack-server-bundle
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
如何利用js實(shí)時(shí)監(jiān)聽input輸入框值的變化
在做web開發(fā)時(shí)候很多時(shí)候都需要即時(shí)監(jiān)聽輸入框值的變化,以便作出即時(shí)動(dòng)作去引導(dǎo)瀏覽者增強(qiáng)網(wǎng)站的用戶體驗(yàn)感,這篇文章主要給大家介紹了關(guān)于如何利用js實(shí)時(shí)監(jiān)聽input輸入框值的變化,需要的朋友可以參考下2024-02-02
Javascript(AJAX)解析XML的代碼(兼容FIREFOX/IE)
Javascript AJAX 解析XML的代碼(兼容FIREFOX/IE)2010-07-07
如何用JS模擬實(shí)現(xiàn)數(shù)組的map方法
這篇文章主要介紹了如何用JS模擬實(shí)現(xiàn)數(shù)組的map方法,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07
微信小程序手機(jī)號授權(quán)一鍵登錄功能實(shí)現(xiàn)代碼
在微信小程序中實(shí)現(xiàn)手機(jī)號一鍵登錄功能,首先需要通過uni.login調(diào)用獲取微信的登錄憑證(code),然后將此code發(fā)送到服務(wù)端,本文給大家介紹微信小程序手機(jī)號授權(quán)一鍵登錄功能,感興趣的朋友跟隨小編一起看看吧2024-10-10
doctype后如何獲得body.clientHeight的方法
doctype后如何獲得body.clientHeight的方法...2007-07-07
Windows Live的@live.com域名注冊漏洞 利用代碼
Windows Live的@live.com域名注冊漏洞 利用代碼...2006-12-12
js輸入框郵箱自動(dòng)提示功能代碼實(shí)現(xiàn)
一個(gè)輸入框當(dāng)我輸入任何字的時(shí)候自動(dòng)下拉相應(yīng)的郵箱提示,在輸入框輸入11的時(shí)候下拉框有所有11的郵箱 輸入其他的時(shí)候 有其他文案對應(yīng)的郵箱,下面實(shí)現(xiàn)這個(gè)自動(dòng)提示功能2013-12-12

