使用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 相关文章推荐
Jquery在IE7下无法使用 $.ajax解决方法
Nov 11 Javascript
Javascript 面向对象 命名空间
May 13 Javascript
file模式访问网页时iframe高度自适应解决方案
Jan 16 Javascript
JavaScript 命名空间 使用介绍
Aug 29 Javascript
jquery购物车实时结算特效实现思路
Sep 23 Javascript
jquery 扑捉回车键事件代码
Apr 24 Javascript
javascript进行数组追加方法小结
Jun 16 Javascript
Java中Timer的用法详解
Oct 21 Javascript
最佳的JavaScript错误处理实践
Jul 16 Javascript
angular ngClick阻止冒泡使用默认行为的方法
Nov 03 Javascript
layui select 禁止点击的实现方法
Sep 05 Javascript
Vue 微信端扫描二维码苹果端却只能保存图片问题(解决方法)
Jan 19 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中将网址转换为超链接的函数
2011/09/02 PHP
深入mysql_fetch_row()与mysql_fetch_array()的区别详解
2013/06/05 PHP
php实现memcache缓存示例讲解
2013/12/04 PHP
php运行提示:Fatal error Allowed memory size内存不足的解决方法
2014/12/17 PHP
php中动态变量用法实例
2015/06/10 PHP
PHP实现留言板功能的详细代码
2017/03/25 PHP
使用jQuery Ajax功能时需要注意的一个问题(内存溢出)
2012/05/30 Javascript
jQuery实现长按按钮触发事件的方法
2015/02/02 Javascript
js实现点击按钮后给Div图层设置随机背景颜色的方法
2015/05/06 Javascript
jquery中map函数遍历数组用法实例
2015/05/18 Javascript
gulp-htmlmin压缩html的gulp插件实例代码
2016/06/06 Javascript
js实现table添加行tr、删除行tr、清空行tr的简单实例
2016/10/15 Javascript
详解springmvc 接收json对象的两种方式
2016/12/06 Javascript
JavaScript获取用户所在城市及地理位置
2018/04/21 Javascript
基于jquery实现左右上下移动效果
2018/05/02 jQuery
JavaScript实现图片放大镜效果
2019/06/27 Javascript
VUE组件中的 Drawer 抽屉实现代码
2019/08/06 Javascript
vue实现五子棋游戏
2020/05/28 Javascript
Vue中keep-alive的两种应用方式
2020/07/15 Javascript
Django项目中包含多个应用时对url的配置方法
2018/05/30 Python
pybind11在Windows下的使用教程
2019/07/04 Python
Python绘制热力图示例
2019/09/27 Python
Python requests接口测试实现代码
2020/09/08 Python
详解pandas赋值失败问题解决
2020/11/29 Python
Python 转移文件至云对象存储的方法
2021/02/07 Python
html5图片上传预览示例分享
2014/04/14 HTML / CSS
爱尔兰领先的在线体育用品零售商:theGAAstore
2018/04/16 全球购物
教师应聘个人求职信
2013/12/10 职场文书
护理毕业生自荐信范文
2013/12/22 职场文书
《挑山工》的教学反思
2014/02/16 职场文书
教师远程培训感言
2014/03/06 职场文书
2014年党总支工作总结
2014/12/18 职场文书
入党政审材料范文
2014/12/24 职场文书
幼儿园教师个人总结
2015/02/05 职场文书
大学运动会通讯稿
2015/07/18 职场文书
SQL Server数据定义——模式与基本表操作
2021/04/05 SQL Server