使用webpack打包koa2 框架app
以前在用koa寫server的時候,發(fā)布簡直是噩夢。需要將src里面的全部文件都覆蓋掉,config配置文件也要覆蓋,稍有不慎就會線上報各種各樣的問題,然后就得回退,本地調(diào)好在發(fā)布。偶然看見一篇文章講 如何使用webpack打包koa app ,驚為天人,原來webpack也能打包后臺。這在以前想都沒想過。
關(guān)鍵問題
一:所有node_modules里的模塊都不進(jìn)行打包
webpack的核心功能是將引用的各個模塊打到一個文件里,并會將各種規(guī)范的模塊進(jìn)行統(tǒng)一的模塊化處理(webpack規(guī)范)。
然而node中包含大量的fs、path操作,這些fs和path操作在打包完成后將沒有操作對象,還會報出很多各樣的錯誤。
所以使用webpack打包的核心就是拒絕打包一切node_modules里的模塊,只是將相對路徑引用的文件打包到一個文件里。恰巧我們發(fā)現(xiàn)webapck提供externals屬性來排除掉不需要打包的模塊。
再深入點我們可以發(fā)現(xiàn):像webpack、nodemon、babel-preset-env這樣的模塊是app開發(fā)環(huán)境依賴的包,我們的程序里根本不會require這些模塊。
綜上可以發(fā)現(xiàn):我們只將所有require到的包排除掉就可以了,這個模塊對應(yīng)的也就是package.json里dependencies下的模塊。有關(guān)dependencies和devDependencies的區(qū)別要理解好。
因此我們可以使用externals-dependencies這個插件配合externals屬性實現(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配置
官方文檔:這些選項可以配置是否 polyfill 或 mock 某些 Node.js全局變量和模塊。這可以使最初為 Node.js 環(huán)境編寫的代碼,在其他環(huá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。
同時將所有的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"); }); }; }
其實是使用promise實現(xiàn)了async函數(shù)的功能。
當(dāng)然這個函數(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放在這里,打包的時候?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)過打包,部署的時候就方便多了,只需要將package.json、app.js、以及view里的html部署上線就好了。然后在服務(wù)器上執(zhí)行
1. npm install
2. npm run for
然后server就后臺運行了。如果需要更新發(fā)布,只需要本地重新npm run dev或npm run build打好包,拖到服務(wù)器覆蓋app.js即可。
相關(guān)文章
node.js 使用 net 模塊模擬 websocket 握手進(jìn)行數(shù)據(jù)傳遞操作示例
這篇文章主要介紹了node.js 使用 net 模塊模擬 websocket 握手進(jìn)行數(shù)據(jù)傳遞操作,結(jié)合實例形式分析了node.js基于net模塊模擬 websocket握手相關(guān)原理及進(jìn)行數(shù)據(jù)傳遞具體操作技巧,需要的朋友可以參考下2020-02-02node+express+axios實現(xiàn)單文件上傳功能
這篇文章主要為大家詳細(xì)介紹了node+express+axios實現(xiàn)單文件上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-08-08使用node-canvas在服務(wù)端渲染echarts圖表解析
這篇文章主要介紹了使用node-canvas在服務(wù)端渲染echarts圖表解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10nodejs的http和https下載遠(yuǎn)程資源post數(shù)據(jù)實例
這篇文章主要為大家介紹了nodejs的http和https下載遠(yuǎn)程資源post數(shù)據(jù)實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09nodejs express搭建服務(wù)并熱更新文件過程詳解
這篇文章主要為大家介紹了nodejs express搭建服務(wù)并熱更新文件過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11node.js 微信開發(fā)之定時獲取access_token
本文給大家分享的是在使用node.js做微信開發(fā)的過程中如何定時獲取access_token的方法,有需要的小伙伴可以參考下2020-02-02