Webpack 服务器端代码打包的示例代码


Posted in Javascript onSeptember 19, 2017

环境变量

之前,我们在项目里会经常使用 process.env.NODE_ENV, 但这个变量对于 webpack打包是有影响的, 在 production 的时候是有优化的.

所以, 我们将改用其他的环境变量来区别:

new webpack.DefinePlugin({
 'process.env.NODE_ENV': '"production"',
 'process.env.API_ENV': `"${process.env.API_ENV || 'development'}"`
})

像这样, NODE_ENV 始终为 production.

而我们实际开发/产品环境, 用 process.env.API_ENV 变量来使用(由于该项目是一个 koa 接口服务项目, 所以这样进行命名, 可以改成任意的, 你开心就好).

动态配置打包

注意

我们以前在 node.js 后端项目中, 动态配置加载一般是这样写:

const ENV = process.env.NODE_ENV || 'development';
// eslint-disable-next-line import/no-dynamic-require
const options = require(`./_${ENV}`);

module.exports = options;

为了提高阅读性, 和可能存在ENV的复用, 我们会单独定义一个变量.

在 webpack 打包的项目中直接这样做的话, 会产生一个问题. 比如我现在有多个配置:

  • _develpment.js
  • _test.js
  • _production.js
  • _staging.js

即便我传入的当前环境为 development, 依然所有的配置文件会被全部打包进来(只是永远不会被执行). 那么这样的话, 就存在敏感信息泄露的风险.

正确的姿势应该是这样的:

config/index.js

// eslint-disable-next-line import/no-dynamic-require
const options = require(`./_${process.env.API_ENV || 'development'}`);

module.exports = options;

模块化打包

比如, 我在项目中有很多个模块, 处于负载均衡的需求, 或者是对于客户定制模块化产品的需求, 我们需要分模块进行打包, 避免其他模块(永远不会被执行的)被打包进 webpack bundle.

// config/_development.js
exports.enabledModules = ['user', 'demo']; 
// 可能 src 目录下 还有其他模块目录, 如 'manage' 等

在服务端加载的时候, 是这样子的:

// src/server.js
// 动态加载启用的模块
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('|')})/.*$`))

进阶使用

比如,src目录下除了各个模块的目录, 还有一些通用方法类,钩子的目录, 如: lib 和 hook. 这两个目录是可能被其他子模块共同引用的. 在插件正则中修改:

new webpack.ContextReplacementPlugin(/src/, new RegExp(`^./(lib|hook|${enabledModules.join('|')})/.*$`))

压缩代码, 并添加 source-map 支持

Uglifyjs 或 Uglify-es 其实对于服务器端代码打包并不友好, 可能会导致打包的失败, 用 babel-minify-webpack-plugin 插件来替代.

配合 source-map-support 插件来支持源码的问题定位.

示例项目源码: https://github.com/AirDwing/webpack-server-bundle

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 数组排序函数
Aug 20 Javascript
js 操作符汇总
Nov 08 Javascript
jquery禁止回车触发表单提交
Dec 12 Javascript
纯js的右下角弹窗实例
Mar 12 Javascript
详解使用JS如何制作简单的ASCII图与单极图
Mar 31 Javascript
详解用webpack把我们的业务模块分开打包的方法
Jul 20 Javascript
jquery实现企业定位式导航效果
Jan 01 jQuery
vue router+vuex实现首页登录验证判断逻辑
May 17 Javascript
解决vue-cli webpack打包后加载资源的路径问题
Sep 25 Javascript
弱类型语言javascript中 a,b 的运算实例小结
Aug 07 Javascript
js实现适配移动端的拖动效果
Jan 13 Javascript
JS监听Esc 键触发事键
Apr 14 Javascript
原生js中ajax访问的实例详解
Sep 19 #Javascript
angularjs实现过滤并替换关键字小功能
Sep 19 #Javascript
详解vue-cli与webpack结合如何处理静态资源
Sep 19 #Javascript
前端常见跨域解决方案(全)
Sep 19 #Javascript
详解.vue文件中监听input输入事件(oninput)
Sep 19 #Javascript
JavaScript数组去重的多种方法(四种)
Sep 19 #Javascript
一步步教你利用Canvas对图片进行处理
Sep 19 #Javascript
You might like
受疫情影响 动画《Re从零开始的异世界生活》第二季延期至7月
2020/03/10 日漫
ThinkPHP的MVC开发机制实例解析
2014/08/23 PHP
php猜单词游戏
2015/09/29 PHP
简单谈谈PHP中的trait
2017/02/25 PHP
PHP使用preg_split和explode分割textarea存放内容的方法分析
2017/07/03 PHP
php实现的后台表格分页功能示例
2017/10/23 PHP
前淘宝前端开发工程师阿当的PPT中有JS技术理念问题
2010/01/15 Javascript
改变javascript函数内部this指针指向的三种方法
2010/04/23 Javascript
js 验证身份证信息有效性
2014/03/28 Javascript
jquery 为a标签绑定click事件示例代码
2014/06/23 Javascript
javascript代码调试之console.log 用法图文详解
2016/09/30 Javascript
BootStrap 模态框实现刷新网页并关闭功能
2017/01/04 Javascript
在ABP框架中使用BootstrapTable组件的方法
2017/07/31 Javascript
将jquery.qqFace.js表情转换成微信的字符码
2017/12/01 jQuery
完美解决手机网页中输入框被输入法遮挡的问题
2017/12/19 Javascript
JavaScript的查询机制LHS和RHS解析
2019/08/16 Javascript
Vue 实现复制功能,不需要任何结构内容直接复制方式
2019/11/09 Javascript
[54:43]DOTA2-DPC中国联赛 正赛 CDEC vs Dynasty BO3 第一场 2月22日
2021/03/11 DOTA
python 随机数生成的代码的详细分析
2011/05/15 Python
对于Python编程中一些重用与缩减的建议
2015/04/14 Python
深入理解Python 关于supper 的 用法和原理
2018/02/28 Python
详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数
2018/04/18 Python
Python开发虚拟环境使用virtualenvwrapper的搭建步骤教程图解
2018/09/19 Python
解决Python2.7中IDLE启动没有反应的问题
2018/11/30 Python
Python代码中如何读取键盘录入的值
2020/05/27 Python
python 图像插值 最近邻、双线性、双三次实例
2020/07/05 Python
Ubuntu权限不足无法创建文件夹解决方案
2020/11/14 Python
python绘图pyecharts+pandas的使用详解
2020/12/13 Python
python+selenium小米商城红米K40手机自动抢购的示例代码
2021/03/24 Python
园林毕业生自我鉴定范文
2013/12/29 职场文书
网络编辑职责
2014/03/01 职场文书
岗位明星事迹材料
2014/05/18 职场文书
文秘自荐信
2014/06/28 职场文书
职场干货:简历中的自我评价应该这样写!
2019/05/06 职场文书
默认网关不可用修复后过一会又不好使了解决方法
2022/04/08 数码科技
Java中的Kafka为什么性能这么快及4大核心详析
2022/09/23 Java/Android