国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > JS > 正文

使用webpack打包koa2 框架app

2024-05-06 16:42:13
字體:
供稿:網(wǎng)友

以前在用koa寫server的時(shí)候,發(fā)布簡直是噩夢。需要將src里面的全部文件都覆蓋掉,config配置文件也要覆蓋,稍有不慎就會線上報(bào)各種各樣的問題,然后就得回退,本地調(diào)好在發(fā)布。偶然看見一篇文章講 如何使用webpack打包koa app ,驚為天人,原來webpack也能打包后臺。這在以前想都沒想過。

關(guān)鍵問題

一:所有node_modules里的模塊都不進(jìn)行打包

webpack的核心功能是將引用的各個(gè)模塊打到一個(gè)文件里,并會將各種規(guī)范的模塊進(jìn)行統(tǒng)一的模塊化處理(webpack規(guī)范)。

然而node中包含大量的fs、path操作,這些fs和path操作在打包完成后將沒有操作對象,還會報(bào)出很多各樣的錯(cuò)誤。

所以使用webpack打包的核心就是拒絕打包一切node_modules里的模塊,只是將相對路徑引用的文件打包到一個(gè)文件里。恰巧我們發(fā)現(xiàn)webapck提供externals屬性來排除掉不需要打包的模塊。

再深入點(diǎn)我們可以發(fā)現(xiàn):像webpack、nodemon、babel-preset-env這樣的模塊是app開發(fā)環(huán)境依賴的包,我們的程序里根本不會require這些模塊。

綜上可以發(fā)現(xiàn):我們只將所有require到的包排除掉就可以了,這個(gè)模塊對應(yīng)的也就是package.json里dependencies下的模塊。有關(guān)dependencies和devDependencies的區(qū)別要理解好。

因此我們可以使用externals-dependencies這個(gè)插件配合externals屬性實(shí)現(xiàn)dependencies的排除工作。

代碼:

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

二:target指向node

官方文檔:編譯為類 Node.js 環(huán)境可用(使用 Node.js require 加載 chunk)

代碼:

target: 'node',

三:增加node配置

官方文檔:這些選項(xiàng)可以配置是否 polyfill 或 mock 某些 Node.js全局變量和模塊。這可以使最初為 Node.js 環(huán)境編寫的代碼,在其他環(huán)境(如瀏覽器)中運(yùn)行。

代碼:

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語法轉(zhuǎn)為es5語法,例如let、const轉(zhuǎn)為var。

同時(shí)將所有的async/await函數(shù)也轉(zhuǎn)成了polyfill里定義的_asyncToGenerator函數(shù)。

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"); }); }; }

其實(shí)是使用promise實(shí)現(xiàn)了async函數(shù)的功能。

當(dāng)然這個(gè)函數(shù)在運(yùn)行時(shí)還需要regeneratorRuntime函數(shù)。所以我在全局引入了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放在這里,打包的時(shí)候?qū)⒉粫籩xternal,必須在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"'      }    }),  ]}

部署

經(jīng)過打包,部署的時(shí)候就方便多了,只需要將package.json、app.js、以及view里的html部署上線就好了。然后在服務(wù)器上執(zhí)行

1. npm install
2. npm run for

然后server就后臺運(yùn)行了。如果需要更新發(fā)布,只需要本地重新npm run dev或npm run build打好包,拖到服務(wù)器覆蓋app.js即可。


注:相關(guān)教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 宿州市| 运城市| 商丘市| 化德县| 西峡县| 灌阳县| 高要市| 沙坪坝区| 满洲里市| 咸丰县| 红河县| 聂拉木县| 缙云县| 镇江市| 邛崃市| 贺州市| 独山县| 皮山县| 高淳县| 北京市| 株洲市| 肃南| 惠安县| 内丘县| 浙江省| 进贤县| 遂溪县| 海口市| 胶南市| 泰和县| 城步| 同德县| 孟村| 永顺县| 徐州市| 泾阳县| 奉贤区| 柳林县| 和龙市| 平武县| 兴化市|