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操纵Cookie实现购物车程序
Feb 15 Javascript
生成二维码方法汇总
Dec 26 Javascript
实例讲解js验证表单项是否为空的方法
Jan 09 Javascript
微信小程序 教程之wxapp视图容器 swiper
Oct 19 Javascript
javascript实现多张图片左右无缝滚动效果
Mar 22 Javascript
Angularjs中的验证input输入框只能输入数字和小数点的写法(推荐)
Aug 16 Javascript
JS/jQuery实现DIV延时几秒后消失或显示的方法
Feb 12 jQuery
vuex 的简单使用
Mar 22 Javascript
详解Vue Elementui中的Tag与页面其它元素相互交互的两三事
Sep 25 Javascript
原生JS实现的自动轮播图功能详解
Dec 28 Javascript
js实现轮播图效果 z-index实现轮播图
Jan 17 Javascript
Java无向树分析 实现最小高度树
Apr 09 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
一个用mysql_odbc和php写的serach数据库程序
2006/10/09 PHP
实例讲解PHP面向对象之多态
2014/08/20 PHP
PHP排序算法之冒泡排序(Bubble Sort)实现方法详解
2018/04/20 PHP
PHP设计模式之建造者模式(Builder)原理与用法案例详解
2019/12/12 PHP
Save a File Using a File Save Dialog Box
2007/06/18 Javascript
效率高的Javscript字符串替换函数的benchmark
2008/08/02 Javascript
jQuery操作select的实例代码
2012/06/14 Javascript
JavaScript编写带旋转+线条干扰的验证码脚本实例
2016/05/30 Javascript
浅谈js中test()函数在正则中的使用
2016/08/19 Javascript
select隐藏选中值对应的id,显示其它id的简单实现方法
2016/08/25 Javascript
前端分页功能的实现以及原理(jQuery)
2017/01/22 Javascript
Vue三层嵌套路由的示例代码
2018/05/05 Javascript
浅谈在Vue.js中如何实现时间转换指令
2019/01/06 Javascript
关于vue状态过渡transition不起作用的原因解决
2019/04/09 Javascript
JavaScript函数式编程(Functional Programming)高阶函数(Higher order functions)用法分析
2019/05/22 Javascript
使用Vue生成动态表单
2019/11/26 Javascript
Python入门_浅谈for循环、while循环
2017/05/16 Python
Django中STATIC_ROOT和STATIC_URL及STATICFILES_DIRS浅析
2018/05/08 Python
python能做什么 python的含义
2019/10/12 Python
Python 中 -m 的典型用法、原理解析与发展演变
2019/11/11 Python
python 消费 kafka 数据教程
2019/12/21 Python
python两个_多个字典合并相加的实例代码
2019/12/26 Python
python保留小数位的三种实现方法
2020/01/07 Python
Python实现投影法分割图像示例(一)
2020/01/17 Python
Python图像处理库PIL的ImageDraw模块介绍详解
2020/02/26 Python
C语言笔试题回忆
2015/04/02 面试题
个人找工作的自我评价
2013/10/17 职场文书
2014两会学习心得:榜样精神伴我行
2014/03/17 职场文书
司仪主持词两篇
2014/03/22 职场文书
检举信的格式及范文
2014/04/04 职场文书
成绩单家长评语大全
2014/04/16 职场文书
机械设计及其自动化专业求职信
2014/06/09 职场文书
党的群众路线教育实践活动组织生活会发言材料
2014/10/17 职场文书
2014年单位法制宣传日活动总结
2014/11/01 职场文书
英文投诉信格式
2015/07/03 职场文书
三八妇女节主持词
2015/07/04 职场文书