參考: https://segmentfault.com/a/1190000000610038
Gruntjs 作為前端工程化工具,能夠很好的對前端資源進行管理(校驗,合並,壓縮)。
久之,發現一個問題
npm install
每次不同的項目都必須使用以上命令初始化,獲取相對應的依賴模塊,而這些模塊往往都是相似。
那么,能否多個項目共用同個 node_modules
,做到一處管理,多處復用呢?
我們嘗試一下:
我們事先初始化一個 node_modules
目錄,包含 grunt
等眾多精彩使用到的模塊
接着,我們分析一下 grunt
模塊下的 task.js
文件,可以找到兩處任務加載的執行函數:
// Load tasks and handlers from a given directory. task.loadTasks = function(taskdir) {} // Load tasks and handlers from a given locally-installed Npm module (installed relative to the base dir). task.loadNpmTasks = function(name) {}
從代碼的注釋可以獲知
task.loadTasks
方法可以從指定的目錄加載任務模塊task.loadNpmTasks
方法則根據當前項目下 Npm module
所在的安裝目錄來加載任務模塊
至此,我們很快可以獲得共享 node_modulse
的靈感,只要稍微改造一下 Gruntfile.js
文件,我們就可以實現之前的想法了。
// 引入 path 模塊 var path = require('path'); module.exports = function(grunt) { // 重新設置 grunt 的項目路徑,獲取當前的 package.json 文件信息 grunt.file.setBase(__dirname); // 獲取當前目錄相對於共享 node_modules 目錄的路徑(以windows下面為例) var nodepath = path.relative(__dirname,'D:/code/node_modules/') grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), concat: "", uglify: "", clean : "" }) // 加載任務 grunt.task.loadTasks(path.join(nodepath,"grunt-contrib-clean",'tasks')); grunt.task.loadTasks(path.join(nodepath,"grunt-contrib-uglify",'tasks')); grunt.task.loadTasks(path.join(nodepath,"grunt-contrib-concat",'tasks')); // 注冊任務 grunt.registerTask('build', ['concat','uglify','clean']); }
注意:
項目目錄和node_modules目錄,需要在同一個目錄下。
d:/code/project
d:/code/node_modules