實現 node_modules 共享


 

參考: 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM