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中的this关键字介绍与使用实例
Jun 21 Javascript
js中的push和join方法使用介绍
Oct 08 Javascript
JS简单实现登陆验证附效果图
Nov 19 Javascript
利用javaScript实现点击输入框弹出窗体选择信息
Dec 11 Javascript
JavaScript检查弹出窗口是否被阻拦的方法技巧
Mar 13 Javascript
Javascript基础教程之比较null和undefined值
May 16 Javascript
js 能实现监听F5页面刷新子iframe 而父页面不刷新的方法
Nov 09 Javascript
JS作用域闭包、预解释和this关键字综合实例解析
Dec 16 Javascript
纯原生js实现table表格的增删
Jan 05 Javascript
微信小程序实现图片自适应(支持多图)
Jan 25 Javascript
从零开始学习Node.js系列教程四:多页面实现的数学运算示例
Apr 13 Javascript
JavaScript实现的拼图算法分析
Feb 13 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的PHP XML类
2006/10/09 PHP
Windows Live的@live.com域名注册漏洞 利用代码
2006/12/27 Javascript
初窥JQuery(二) 事件机制(1)
2010/11/25 Javascript
TimergliderJS 一个基于jQuery的时间轴插件
2011/12/07 Javascript
Javascript中的delete介绍
2012/09/02 Javascript
javascript实现可改变滚动方向的无缝滚动实例
2013/06/17 Javascript
js确认删除对话框效果的示例代码
2014/02/20 Javascript
js实现select跳转菜单新窗口效果代码分享(超简单)
2015/08/21 Javascript
高效利用Angular中内置服务$http、$location等
2016/03/22 Javascript
JavaScript继承学习笔记【新手必看】
2016/05/10 Javascript
JavaScript 轮播图和自定义滚动条配合鼠标滚轮分享代码贴
2016/10/28 Javascript
Node.js Express安装与使用教程
2018/05/11 Javascript
详解Koa中更方便简单发送响应的方式
2018/07/20 Javascript
Vue2.2.0+新特性整理及注意事项
2018/08/22 Javascript
Element-ui之ElScrollBar组件滚动条的使用方法
2018/09/14 Javascript
Electron-vue脚手架改造vue项目的方法
2018/10/22 Javascript
富文本编辑器vue2-editor实现全屏功能
2019/05/26 Javascript
基于vue 动态菜单 刷新空白问题的解决
2020/08/06 Javascript
[51:10]VP vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
详解Python的迭代器、生成器以及相关的itertools包
2015/04/02 Python
python实现网站的模拟登录
2016/01/04 Python
详解Python函数作用域的LEGB顺序
2016/05/14 Python
Python中的groupby分组功能的实例代码
2018/07/11 Python
pycharm设置当前工作目录的操作(working directory)
2020/02/14 Python
Python3实现打印任意宽度的菱形代码
2020/04/12 Python
python不同版本的_new_不同点总结
2020/12/09 Python
使用Python爬取小姐姐图片(beautifulsoup法)
2021/02/11 Python
体育纪念品、亲笔签名的体育收藏品:Steiner Sports
2020/07/31 全球购物
数控技术专业推荐信
2013/11/01 职场文书
法学研究生自我鉴定范文
2013/12/04 职场文书
会计找工作求职信范文
2013/12/09 职场文书
重大事项社会稳定风险评估方案
2014/06/15 职场文书
2015年个人剖析材料范文
2014/12/29 职场文书
大学生求职自荐信
2015/03/24 职场文书
Linux服务器离线安装 nginx的详细步骤
2022/06/16 Servers
Android学习之BottomSheetDialog组件的使用
2022/06/21 Java/Android