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判断密码强度(自写代码)
Sep 06 Javascript
JS获取节点的兄弟,父级,子级元素的方法
Jan 09 Javascript
jquery中$(#form :input)与$(#form input)的区别
Aug 18 Javascript
基于js实现投票的实例代码
Aug 04 Javascript
JavaScript中的this,call,apply使用及区别详解
Jan 29 Javascript
JS获取当前页面名称的简单实例
Aug 19 Javascript
vue.js实现仿原生ios时间选择组件实例代码
Dec 21 Javascript
获取当前按钮或者html的ID名称实例(推荐)
Jun 23 Javascript
vue实现长图垂直居上 vue实现短图垂直居中
Oct 18 Javascript
js中Object.defineProperty()方法的不详解
Jul 09 Javascript
js监听html页面的上下滚动事件方法
Sep 11 Javascript
vue 开发企业微信整合案例分析
Dec 02 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 编程安全性小结
2010/01/08 PHP
php文件夹与文件目录操作函数介绍
2013/09/09 PHP
php实现的任意进制互转类分享
2015/07/07 PHP
PHP调用全国天气预报数据接口查询天气示例
2019/02/20 PHP
Laravel 5.1 框架Blade模板引擎用法实例分析
2020/01/04 PHP
IE、FF浏览器下修改标签透明度
2014/01/28 Javascript
node.js中的fs.realpathSync方法使用说明
2014/12/16 Javascript
node.js中的fs.rmdir方法使用说明
2014/12/16 Javascript
Nodejs中读取中文文件编码问题、发送邮件和定时任务实例
2015/01/01 NodeJs
javascript数据结构与算法之检索算法
2015/04/04 Javascript
javascript中attachEvent用法实例分析
2015/05/14 Javascript
js代码实现无缝滚动(文字和图片)
2015/08/20 Javascript
BootStrap智能表单实战系列(三)分块表单配置详解
2016/06/13 Javascript
AngularJS 依赖注入详解和简单实例
2016/07/28 Javascript
vue.js select下拉框绑定和取值方法
2018/03/03 Javascript
js canvas画布实现高斯模糊效果
2018/11/27 Javascript
NodeJS读取分析Nginx错误日志的方法
2019/05/14 NodeJs
浅析webpack-bundle-analyzer在vue-cli3中的使用
2019/10/23 Javascript
JavaScript实现放大镜效果代码示例
2020/04/29 Javascript
jquery实现简单每周轮换的日历
2020/09/10 jQuery
Python中的Numeric包和Numarray包使用教程
2015/04/13 Python
Python中的类与类型示例详解
2019/07/10 Python
分享8点超级有用的Python编程建议(推荐)
2019/10/13 Python
Python实现RabbitMQ6种消息模型的示例代码
2020/03/30 Python
python 实现汉诺塔游戏
2020/11/28 Python
CSS3的transition和animation的用法实例介绍
2014/08/20 HTML / CSS
HTML5中判断用户是否正在浏览页面的方法
2014/05/03 HTML / CSS
如何给HTML标签中的文本设置修饰线
2019/11/18 HTML / CSS
英国领先的名牌服装折扣零售商:Brown Bag Clothing
2019/01/08 全球购物
美体小铺奥地利官方网站:The Body Shop奥地利
2019/04/11 全球购物
先进班级集体事迹材料
2014/01/30 职场文书
八一建军节感言
2014/02/28 职场文书
学校党的群众路线教育实践活动总结材料
2014/10/30 职场文书
2014小学年度工作总结
2014/12/20 职场文书
2015年教学工作总结
2015/04/02 职场文书
vscode远程免密登入Linux服务器的配置方法
2022/06/28 Servers