使用webpack打包koa2 框架app


Posted in Javascript onFebruary 02, 2018

以前在用koa写server的时候,发布简直是噩梦。需要将src里面的全部文件都覆盖掉,config配置文件也要覆盖,稍有不慎就会线上报各种各样的问题,然后就得回退,本地调好在发布。偶然看见一篇文章讲 如何使用webpack打包koa app ,惊为天人,原来webpack也能打包后台。这在以前想都没想过。

关键问题

一:所有node_modules里的模块都不进行打包

webpack的核心功能是将引用的各个模块打到一个文件里,并会将各种规范的模块进行统一的模块化处理(webpack规范)。

然而node中包含大量的fs、path操作,这些fs和path操作在打包完成后将没有操作对象,还会报出很多各样的错误。

所以使用webpack打包的核心就是拒绝打包一切node_modules里的模块,只是将相对路径引用的文件打包到一个文件里。恰巧我们发现webapck提供externals属性来排除掉不需要打包的模块。

再深入点我们可以发现:像webpack、nodemon、babel-preset-env这样的模块是app开发环境依赖的包,我们的程序里根本不会require这些模块。

综上可以发现:我们只将所有require到的包排除掉就可以了,这个模块对应的也就是package.json里dependencies下的模块。有关dependencies和devDependencies的区别要理解好。

因此我们可以使用externals-dependencies这个插件配合externals属性实现dependencies的排除工作。

代码:

const webpack = require('webpack');
const _externals = require('externals-dependencies')
module.exports = {
  ...
  externals: _externals(),
  ...
}

二:target指向node

官方文档:编译为类 Node.js 环境可用(使用 Node.js require 加载 chunk)

代码:

target: 'node',

三:增加node配置

官方文档:这些选项可以配置是否 polyfill 或 mock 某些 Node.js全局变量和模块。这可以使最初为 Node.js 环境编写的代码,在其他环境(如浏览器)中运行。

代码:

node: {
    console: true,
    global: true,
    process: true,
    Buffer: true,
    __filename: true,
    __dirname: true,
    setImmediate: true,
    path: true
},

四:babel配置

为了兼容低版本的node不原生支持async/await的问题。这里babel我使用了babel-preset-env{"modules": false}的配置。此配置会将es6语法转为es5语法,例如let、const转为var。

同时将所有的async/await函数也转成了polyfill里定义的_asyncToGenerator函数。

function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }

其实是使用promise实现了async函数的功能。

当然这个函数在运行时还需要regeneratorRuntime函数。所以我在全局引入了babel-polyfill来提供regeneratorRuntime函。

注:如果你的node版本很高且原生支持async/await,大可将babel-preset-env和babel-polyfill省略掉

代码:

const path = require('path');
const webpack = require('webpack');
const _externals = require('externals-dependencies')

module.exports = {
  entry: {
    app: [
      // 如果polyfill放在这里,打包的时候将不会被external,必须在js里require才能有效external
      // 'babel-polyfill',
      './src/index.js'
    ]
  },
  output: {
    path: path.resolve(__dirname),
    filename: '[name].js'
  },
  resolve: {
    extensions: [".js"]
  },
  target: 'node',
  externals: _externals(),
  context: __dirname,
  node: {
    console: true,
    global: true,
    process: true,
    Buffer: true,
    __filename: true,
    __dirname: true,
    setImmediate: true,
    path: true
  },
  module: {
    rules: [
      {
        test: /\.js/,
        use: ['babel-loader']
      }
    ]
  },
  plugins: [
    new webpack.DefinePlugin({
      'process.env': {
        NODE_ENV: '"development"'
      }
    }),
  ]
}

部署

经过打包,部署的时候就方便多了,只需要将package.json、app.js、以及view里的html部署上线就好了。然后在服务器上执行

1. npm install
2. npm run for

然后server就后台运行了。如果需要更新发布,只需要本地重新npm run dev或npm run build打好包,拖到服务器覆盖app.js即可。

Javascript 相关文章推荐
Easy.Ajax 部分源代码 支持文件上传功能, 兼容所有主流浏览器
Feb 24 Javascript
js下拉框二级关联菜单效果代码具体实现
Aug 03 Javascript
JS实现先显示大图后自动收起显示小图的广告代码
Sep 04 Javascript
JavaScript跨域调用基于JSON的RESTful API
Jul 09 Javascript
vue组件间通信解析
Mar 01 Javascript
js中getter和setter用法实例分析
Aug 14 Javascript
详解Vue 全局变量,局部变量
Apr 17 Javascript
JavaScript数组排序小程序实现解析
Jan 13 Javascript
vue vantUI tab切换时 list组件不触发load事件的问题及解决方法
Feb 14 Javascript
jQuery 函数实例分析【函数声明、函数表达式、匿名函数等】
May 19 jQuery
Vue中的this.$options.data()和this.$data用法说明
Jul 26 Javascript
详解node.js创建一个web服务器(Server)的详细步骤
Jan 15 Javascript
Vue组件化开发思考
Feb 02 #Javascript
微信小程序实现导航栏选项卡效果
Jun 19 #Javascript
解析Vue.js中的组件
Feb 02 #Javascript
如何将你的AngularJS1.x应用迁移至React的方法
Feb 01 #Javascript
vue 2.0 购物车小球抛物线的示例代码
Feb 01 #Javascript
js中getBoundingClientRect的作用及兼容方案详解
Feb 01 #Javascript
深入剖析Express cookie-parser中间件实现示例
Feb 01 #Javascript
You might like
php全角字符转换为半角函数
2014/02/07 PHP
WordPress开发中的get_post_custom()函数使用解析
2016/01/04 PHP
php+ajax+json 详解及实例代码
2016/12/12 PHP
PHP中关键字interface和implements详解
2017/06/14 PHP
javascript 函数调用规则
2009/08/26 Javascript
jquery 可排列的表实现代码
2009/11/13 Javascript
JS如何将UTC格式时间转本地格式
2013/09/04 Javascript
js用拖动滑块来控制图片大小的方法
2015/02/27 Javascript
jquery实现可关闭的倒计时广告特效代码
2015/09/02 Javascript
js+canvas绘制五角星的方法
2016/01/28 Javascript
javascript每日必学之条件分支
2016/02/17 Javascript
JavaScript中的Reflect对象详解(ES6新特性)
2016/07/22 Javascript
基于jQuery实现数字滚动效果
2017/01/16 Javascript
想用好React的你必须要知道的一些事情
2017/07/24 Javascript
详解基于vue的移动web app页面缓存解决方案
2017/08/03 Javascript
详解js实时获取并显示当前时间的方法
2019/05/10 Javascript
JS实现动态添加外部js、css到head标签的方法
2019/06/05 Javascript
在antd4.0中Form使用initialValue操作
2020/11/02 Javascript
使用js获取身份证年龄的示例代码
2020/12/11 Javascript
[01:01:25]DOTA2上海特级锦标赛B组资格赛#2 Fnatic VS Spirit第三局
2016/02/27 DOTA
python封装对象实现时间效果
2020/04/23 Python
使用Python编写简单的画图板程序的示例教程
2015/12/08 Python
200行自定义python异步非阻塞Web框架
2017/03/15 Python
python操作openpyxl导出Excel 设置单元格格式及合并处理代码实例
2019/08/27 Python
Django与AJAX实现网页动态数据显示的示例代码
2021/02/24 Python
计算机应用专业推荐信
2013/11/13 职场文书
创业计划书——互联网商机
2014/01/12 职场文书
元旦获奖感言
2014/03/08 职场文书
成龙洗发水广告词
2014/03/14 职场文书
火灾现场处置方案
2014/05/28 职场文书
常务副县长“四风”个人对照检查材料思想汇报
2014/10/02 职场文书
简历中自我评价范文
2015/03/11 职场文书
2015年物资管理工作总结
2015/05/20 职场文书
2016年“六一儿童节”校园广播稿
2015/12/17 职场文书
一文搞懂Python Sklearn库使用
2021/08/23 Python
能用CSS实现的就不要麻烦JavaScript了
2021/10/05 HTML / CSS