最近寫了一個node項目,作用是通過js代碼來處理一些mysql數據庫的數據。爲了方便後臺同事操作方便,我就想把所有的處理模塊合起來用webpack打包成一個js文件給後臺的同事使用,抱着這樣的想法我就開始了,然而…webpack給了我一堆這樣的錯誤:
通過各種嘗試發現,這些報錯是 require('mysql')
引起的,應該是mysql中引用了fs、tls、net 這些模塊,然後這些模塊又無法使用webpack進行打包,然後就百度,百度不行就谷歌,相關的資料很少,但是功夫不負有心人,在一個國外的帖子中看到一個類似問題,最後結帖的評論是 webpack是打包前端模塊的,技術上不支持打包node服務端的這些模塊。
也就是說,我一開始的想法就是錯誤的,不應該想着一定要將mysql打包到js文件中,而是應該將mysql排除在webpack打包的模塊之外,然後在js文件運行時提供mysql模塊。這時我們就可以用到webpack的externals
節點的配置,通過這個配置可以在webpack時不打包mysql模塊,在輸出的js文件中保留require('mysql')
,然後在打包好的js文件運行時引用外部的mysql模塊。這種方式也是webpack在打包服務端的node工程時所採用的方法。具體配置如下:
module.exports = {
externals: {
mysql: 'commonjs mysql'
}
}
打包好後,將mysql的npm包手動放到index.bundle.js同級的node_modules文件夾內,最後用於運行的文檔結構如下所示:
index.bundle.js是打包後的js文件,node_modules是該js運行依賴的外部庫,進入該文件夾後直接運行node index.bundle.js
就能成功執行index.bundle.js文件了。