天天看點

node中webpack打包mysql報錯 Module not found: Error: Can't resolve 'fs' 、'net'、'tls'

  最近寫了一個node項目,作用是通過js代碼來處理一些mysql資料庫的資料。為了友善背景同僚操作友善,我就想把所有的處理子產品合起來用webpack打包成一個js檔案給背景的同僚使用,抱着這樣的想法我就開始了,然而…webpack給了我一堆這樣的錯誤:

node中webpack打包mysql報錯 Module not found: Error: Can't resolve 'fs' 、'net'、'tls'

  通過各種嘗試發現,這些報錯是

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檔案夾内,最後用于運作的文檔結構如下所示:

node中webpack打包mysql報錯 Module not found: Error: Can't resolve 'fs' 、'net'、'tls'

index.bundle.js是打包後的js檔案,node_modules是該js運作依賴的外部庫,進入該檔案夾後直接運作

node index.bundle.js

就能成功執行index.bundle.js檔案了。