Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 国内精品免费久久久久妲己,亚洲国产精品综合久久一线,91久久精品国产免费一区

          整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          前端網紅框架的插件機制全梳理(axios、koa、r

          前端網紅框架的插件機制全梳理(axios、koa、redux、vuex)


          者:ssh前端

          轉發連接:https://mp.weixin.qq.com/s/jKSVAHIhSnL49tzguIdZkQ

          者:一江西流

          轉發鏈接:https://mp.weixin.qq.com/s/CZNJdtTxOCXJdW4Iu0N2kQ

          以前在用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的排除工作。

          代碼:

          .

          二:target指向node

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

          代碼:

          .

          三:增加node配置

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

          代碼:

          .

          四: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省略掉

          代碼:

          .

          .

          部署

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

          .

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


          主站蜘蛛池模板: 大香伊蕉日本一区二区| 久久毛片免费看一区二区三区| 亚洲AV无码一区二区三区鸳鸯影院 | 久久久久女教师免费一区| 国产精品日本一区二区在线播放| 天堂一区人妻无码| 久久久精品人妻一区二区三区蜜桃 | 国产av福利一区二区三巨| 亚欧在线精品免费观看一区| 国产亚洲一区二区在线观看| 国产亚洲综合精品一区二区三区| 亚洲日韩一区精品射精| 一区二区在线观看视频| 久久国产精品视频一区| 国产在线精品一区二区三区不卡| 激情啪啪精品一区二区| 精品国产区一区二区三区在线观看 | 日本午夜精品一区二区三区电影| 久久久久人妻一区精品| 人妻体内射精一区二区| 国产成人精品一区二三区| 无码aⅴ精品一区二区三区| 国产精品电影一区| 精品动漫一区二区无遮挡| 精品一区高潮喷吹在线播放| 精品无码一区二区三区亚洲桃色| 亚洲AV综合色区无码一区爱AV| 亚洲一区爱区精品无码| 亚洲一区二区三区夜色| 无码人妻精品一区二区| 亚洲av乱码一区二区三区| 国产一区二区三区影院| 精品欧美一区二区在线观看| 一本一道波多野结衣AV一区| 日韩视频一区二区| 亚洲日本中文字幕一区二区三区| 精品人妻少妇一区二区| 国精品无码一区二区三区左线| 国产一区二区三区精品视频| 一区二区三区视频在线| 亚洲av色香蕉一区二区三区|