2016-03-14 96 views
1

我正嘗試使用現代方法構建無Grunt或Gulp的JavaScript應用程序。我正在使用package.json中的scripts關鍵字來創建我的構建實用程序。使用純npm腳本創建vendor.js包

它很好,但我碰到了一個挑戰。是否有一種很好的方法可以創建單獨的vendor.jsapp.js包,而不必在browserify命令中明確指定每個依賴項(或者將browse列表的命令傳遞給browserify命令)?

東西優於:

"dependencies": { 
    "react": "latest", 
    "react-dom": "latest", 
    "redux": "latest", 
    "d3": "latest" 
}, 
"devDependencies": { 
    "browserify": "latest" 
}, 
"scripts": { 
    "vendor": "browserify -r react -r react-dom -r redux -r d3 > vendor.js", 
    "app": "browserify -x react -x react-dom -x redux -x d3 ./app/main.js > app.js" 
} 

優選的,我會回收存儲在dependencies關鍵字的信息。很明顯,我不希望捆綁devDependencies或未在我的代碼中使用的依賴項(即使後者可以通過良好的維護要求來阻止)。

回答

1

是的,這是可能的。無論解決方案是否非常優雅,我都會留給你決定。基本上它歸結爲類似下面的(不完整的,browserify尚未調用)片段:

"scripts": { 
     "init": "npm ls -json --depth 0 | jq .dependencies | jq keys[]", 
     "vendor": "npm run --silent init | sed 's/\\(.*\\)/-r \\1/g' | xargs" 
    }, 

初始化腳本用於提取的依賴關係。供應商腳本調用此腳本,並將其轉換爲browserify的輸入參數。

注1:我使用jq從依賴關係樹中提取信息。注2:參數列表的構造也可以在init腳本中完成。您將不得不提供一個環境變量來區分-r或-x選項。

+0

感謝您的支持。我會試試這個。在那個筆記上,似乎切換到WebPack並且使用它們的配置文件可能是一個更清潔的解決方案。 –