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 Function对象扩展之延时执行函数
Jul 06 Javascript
jqgrid 简单学习笔记
May 03 Javascript
JS通过分析userAgent属性来判断浏览器的类型及版本
Mar 28 Javascript
JavaScript内存管理介绍
Mar 13 Javascript
angularjs学习笔记之三大模块(modal,controller,view)
Sep 26 Javascript
node.js版本管理工具n无效的原理和解决方法
Nov 24 Javascript
JS中如何实现复选框全选功能
Dec 19 Javascript
JavaScript中transform实现数字翻页效果
Mar 08 Javascript
微信小程序实现自定义picker选择器弹窗内容
May 26 Javascript
weui中的picker使用js进行动态绑定数据问题
Nov 06 Javascript
js实现限定区域范围拖拉拽效果
Nov 20 Javascript
vue从后台渲染文章列表以及根据id跳转文章详情详解
Dec 14 Vue.js
原生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
星际玩家的三大定律
2020/03/04 星际争霸
Win2000+Apache+MySql+PHP4+PERL安装使用小结
2006/10/09 PHP
解析PHP实现下载文件的两种方法
2013/07/05 PHP
使用PHP和JavaScript判断请求是否来自微信内浏览器
2015/08/18 PHP
PHP Smarty模版简单使用方法
2016/03/30 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
2020/03/24 PHP
几个高效,简洁的字符处理函数
2007/04/12 Javascript
js使用for循环及if语句判断多个一样的name
2014/09/09 Javascript
Node.js重新刷新session过期时间的方法
2016/02/04 Javascript
js 点击a标签 获取a的自定义属性方法
2016/11/21 Javascript
微信小程序获取手机网络状态的方法【附源码下载】
2017/12/08 Javascript
nodejs+express搭建多人聊天室步骤
2018/02/12 NodeJs
一些手写JavaScript常用的函数汇总
2019/04/16 Javascript
解决layer弹出层msg的文字不显示的问题
2019/09/11 Javascript
JS实现拼图游戏
2021/01/29 Javascript
JS如何定义用字符串拼接的变量
2020/07/11 Javascript
Python IDE PyCharm的基本快捷键和配置简介
2015/11/04 Python
python自动化测试之如何解析excel文件
2019/06/27 Python
python中对数据进行各种排序的方法
2019/07/02 Python
python 中xpath爬虫实例详解
2019/08/26 Python
python使用pip安装SciPy、SymPy、matplotlib教程
2019/11/20 Python
pytorch动态网络以及权重共享实例
2020/01/06 Python
Python在终端通过pip安装好包以后在Pycharm中依然无法使用的问题(三种解决方案)
2020/03/10 Python
python中读入二维csv格式的表格方法详解(以元组/列表形式表示)
2020/04/24 Python
django admin管理工具自定义时间区间筛选器DateRangeFilter介绍
2020/05/19 Python
详解Python 循环嵌套
2020/07/09 Python
Python 多进程原理及实现
2020/12/21 Python
纯css3实现的竖形无限级导航
2014/12/10 HTML / CSS
入党积极分子思想汇报
2014/01/02 职场文书
物流仓管员工作职责
2014/01/06 职场文书
中文专业学生自我评价范文
2014/02/06 职场文书
技能比武方案
2014/05/21 职场文书
第一批党的群众路线教育实践活动总结报告
2014/07/03 职场文书
正能量励志演讲稿三分钟(范文)
2019/07/11 职场文书
pytorch 梯度NAN异常值的解决方案
2021/06/05 Python
SQLServer RANK() 排名函数的使用
2022/03/23 SQL Server