使用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 相关文章推荐
Javascript模拟加速运动与减速运动代码分享
Dec 11 Javascript
BootStrap智能表单实战系列(三)分块表单配置详解
Jun 13 Javascript
jQuery模仿单选按钮选中效果
Jun 24 Javascript
微信小程序 require机制详解及实例代码
Dec 14 Javascript
node.js程序作为服务并在windows下开机自启动(用forever)
Mar 29 Javascript
使用jQuery.Pin垂直滚动时固定导航
May 24 jQuery
js 公式编辑器 - 自定义匹配规则 - 带提示下拉框 - 动态获取光标像素坐标
Jan 04 Javascript
微信小程序App生命周期详解
Jan 31 Javascript
JS中this的指向以及call、apply的作用
May 06 Javascript
Javascript操作select控件代码实例
Feb 14 Javascript
JS数组的高级使用方法示例小结
Mar 14 Javascript
axios封装与传参示例详解
Oct 18 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安装为Apache DSO
2006/10/09 PHP
深入浅析php json 格式控制
2015/12/24 PHP
jQuery 解析xml文件
2009/08/09 Javascript
使用JavaScript库还是自己写代码?
2010/01/28 Javascript
DB.ASP 用Javascript写ASP很灵活很好用很easy
2011/07/31 Javascript
用JS提交参数创建form表单在FireFox中遇到的问题
2013/01/16 Javascript
javascipt匹配单行和多行注释的正则表达式
2013/11/20 Javascript
使用js画图之饼图
2015/01/12 Javascript
深入浅出理解javaScript原型链
2015/05/09 Javascript
Angular Js文件上传之form-data
2015/08/28 Javascript
基于JavaScript实现类似于百度学术高级检索功能
2016/03/02 Javascript
Wireshark基本介绍和学习TCP三次握手
2016/08/15 Javascript
Vue.Js中的$watch()方法总结
2017/03/23 Javascript
JS使用插件cryptojs进行加密解密数据实例
2017/05/11 Javascript
jQuery导航条固定定位效果实例代码
2017/05/26 jQuery
JS实现电商放大镜效果
2017/08/24 Javascript
js中url对象化管理分析
2017/12/29 Javascript
对vue中v-if的常见使用方法详解
2018/09/28 Javascript
Vue CLI项目 axios模块前后端交互的使用(类似ajax提交)
2019/09/01 Javascript
layui实现显示数据表格、搜索和修改功能示例
2020/06/03 Javascript
原生js实现贪吃蛇游戏
2020/10/26 Javascript
详解vue-cli项目在IE浏览器打开报错解决方法
2020/12/10 Vue.js
修改NPM全局模式的默认安装路径的方法
2020/12/15 Javascript
[02:57]2014DOTA2国际邀请赛 选手辛苦解说更辛苦
2014/07/10 DOTA
从Python的源码浅要剖析Python的内存管理
2015/04/16 Python
eclipse创建python项目步骤详解
2019/05/10 Python
python里运用私有属性和方法总结
2019/07/08 Python
python实现将文件夹内的每张图片批量分割成多张
2019/07/22 Python
html5 自定义播放器核心代码
2013/12/20 HTML / CSS
HTML5 Canvas中绘制矩形实例
2015/01/01 HTML / CSS
M.M.LaFleur官网:美国职业女装品牌
2020/10/27 全球购物
担保书格式及范文
2014/04/01 职场文书
2014公安机关纪律作风整顿思想汇报
2014/09/13 职场文书
门店店长岗位职责
2015/04/14 职场文书
幼儿园小班教学反思
2016/03/03 职场文书
如何撰写创业策划书
2019/06/27 职场文书