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 相关文章推荐
Prototype Number对象 学习
Jul 19 Javascript
artDialog 4.1.5 Dreamweaver代码提示/补全插件 附下载
Jul 31 Javascript
js实现拖拽 闭包函数详细介绍
Nov 25 Javascript
js用正则表达式来验证表单(比较齐全的资源)
Nov 17 Javascript
js实现touch移动触屏滑动事件
Apr 17 Javascript
JS实现自动定时切换的简洁网页选项卡效果
Oct 13 Javascript
HTML5 实现的一个俄罗斯方块实例代码
Sep 19 Javascript
jquery 动态增加删除行的简单实例(推荐)
Oct 12 Javascript
angularjs 获取默认选中的单选按钮的value方法
Feb 28 Javascript
angularjs $http调用接口的方式详解
Aug 13 Javascript
详解vue 兼容IE报错解决方案
Dec 29 Javascript
使用Jenkins部署React项目的方法步骤
Mar 11 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
PHP实现链式操作的原理详解
2016/09/16 PHP
学习ExtJS Column布局
2009/10/08 Javascript
JavaScript类属性的访问方式详解
2014/02/11 Javascript
jquery缓动swing liner控制动画过程不同时刻的速度
2014/05/29 Javascript
js时间日期格式化封装函数
2014/12/02 Javascript
javascript实现的淘宝旅行通用日历组件用法实例
2015/08/03 Javascript
jQuery获取cookie值及删除cookie用法实例
2016/04/15 Javascript
AngularJS基础 ng-open 指令简单实例
2016/08/02 Javascript
JS对大量数据进行多重过滤的方法
2016/11/04 Javascript
Bootstrap 下拉多选框插件Bootstrap Multiselect
2017/01/22 Javascript
jQuery EasyUI Accordion可伸缩面板组件使用详解
2017/02/28 Javascript
nodejs入门教程二:创建一个简单应用示例
2017/04/24 NodeJs
H5上传本地图片并预览功能
2017/05/08 Javascript
JavaScript重复元素处理方法分析【统计个数、计算、去重复等】
2017/12/14 Javascript
详解jquery和vue对比
2019/04/16 jQuery
基于JS实现一个随机生成验证码功能
2019/05/29 Javascript
详解React 条件渲染
2020/07/08 Javascript
Python中使用md5sum检查目录中相同文件代码分享
2015/02/02 Python
Python爬虫之pandas基本安装与使用方法示例
2018/08/08 Python
Python3爬楼梯算法示例
2019/03/04 Python
详解Python中的正斜杠与反斜杠
2019/08/09 Python
python多线程同步之文件读写控制
2021/02/25 Python
Python 利用Entrez库筛选下载PubMed文献摘要的示例
2020/11/24 Python
CSS3教程(8):CSS3透明度指南
2009/04/02 HTML / CSS
HTML5和CSS3让网页设计提升到下一个高度
2009/08/14 HTML / CSS
AmazeUI中模态框的实现
2020/08/19 HTML / CSS
美体小铺瑞典官方网站:The Body Shop瑞典
2018/01/27 全球购物
护理学毕业生自荐信
2013/10/02 职场文书
财务会计专业个人求职信范本
2014/01/08 职场文书
马丁路德金演讲稿
2014/05/19 职场文书
丧事主持词
2015/07/02 职场文书
2019公司管理制度
2019/04/19 职场文书
关于Numpy之repeat、tile的用法总结
2021/06/02 Python
Java常用工具类汇总 附示例代码
2021/06/26 Java/Android
《最终幻想14》6.01版本4月5日推出 追加新任务新道具
2022/04/03 其他游戏
MySQL索引 高效获取数据的数据结构
2022/05/02 MySQL