实现 node_modules 共享

熵桥流沙
• 阅读 11268

Gruntjs 作为前端工程化工具,能够很好的对前端资源进行管理(校验,合并,压缩)。

久之,发现一个问题

npm install

每次不同的项目都必须使用以上命令初始化,获取相对应的依赖模块,而这些模块往往都是相似。

那么,能否多个项目共用同个 node_modules ,做到一处管理,多处复用呢?

我们尝试一下:

我们事先初始化一个 node_modules 目录,包含 grunt 等众多精彩使用到的模块

实现 node_modules 共享

接着,我们分析一下 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:/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']);
}

Made it!! 如获至宝,马上命令行执行 grunt build。 吶呢,出错啦:

Fatal error: Unable to find local grunt.

出错的原因也比较简单,我们把 grunt 的目录给忽略了,因此在必须在执行命令的时候告诉 grunt 目录的位置,加上 --base 参数,就能成功运行了。

grunt build --base = d:\node_modules\

因为我们这里人为的加上 --base 参数,改变了当前项目下 grunt 目录地址,在运行任务的时候,需要重新设置回去,这也解释了为什么需要在 Gruntfile.js 加上以下代码:

grunt.file.setBase(__dirname);

PS: 以上为 windows 下的实现方法,最好把共享的 node_modules 和项目放置在同一分区,不然会出现文件路径不兼容的问题,Unix 和 linux 没有分区的概念,所以没有问题,其他的设置都一样。

The End, Enjoy it!

点赞
收藏
评论区
推荐文章
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
徐小夕 徐小夕
3年前
lerna + dumi + eslint多包管理实践
背景在开发大型项目时,我们通常会遇到同一工程依赖不同组件包,同时不同的组件包之间还会相互依赖的问题,那么如何管理组织这些依赖包就是一个迫在眉睫的问题.我们目前已有的方案有:Multirepo(多个依赖包独立进行git管理)和Monorepo(所有依赖库完全放入一个项目工程).Multirepo的缺点在于每个库变更之后,需要发布到线上,然后在项目
Node工程的依赖包管理方式
在前端工程化中,JavaScript依赖包管理是非常重要的一环。依赖包通常是项目所依赖的第三方库、工具和框架等资源,它们能够帮助我们减少重复开发、提高效率并且确保项目可以正确的运行。
Easter79 Easter79
3年前
springboot2之优雅处理返回值
前言最近项目组有个老项目要进行前后端分离改造,应前端同学的要求,其后端提供的返回值格式需形如{"status":0,"message":"success","data":{}}方便前端数据处理。要实现前端同学这个需求,其实也挺简单的,
Wesley13 Wesley13
3年前
maven父子模块jar包管理和spring boot
maven父子模块jar包管理和springboot项目结构:parent父模块空maven项目,用于管理子模块controllerservicedaomodelclient被其他项目依赖进行微服务内部调用(因下面问题导致client
Stella981 Stella981
3年前
Spring Cloud 系列之 Sleuth 链路追踪(一)
随着微服务架构的流行,服务按照不同的维度进行拆分,一次请求往往需要涉及到多个服务。互联网应用构建在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发、可能使用不同的编程语言来实现、有可能布在了几千台服务器,横跨多个不同的数据中心。因此,就需要一些可以帮助理解系统行为、用于分析性能问题的工具,以便发生故障的时候,能够快速定位和解决问题。在复杂的微服务架
Stella981 Stella981
3年前
Python虚拟环境的创建和包下载
为什么使用虚拟环境因为直接在真实环境进行安装python的包会造成环境之间的污染,因此需要创建虚拟环境,原则上每一个项目都需要有一个独属于自己的虚拟环境Python项目的每次运行都需要启动环境,如果所有的模块都在一个环境中,不仅每次加载这些模块慢(尤其是开发过程中),并且依赖还可能相互冲突,甚至有些新引入的依赖会修改已安装模块的版
撮合前端平台在低代码平台的落地实践 | 京东云技术团队
基于传统认知,前端产品直接触达消费者,往往具有高度的定制化、需求变更频繁等特点,要求具有很好的动态性,能够满足不同客户的需求。那么能否建设类似的前端中台产品,我们姑且称之为“前端领域产品”,实现接入团队端到端能力复用呢?我们在撮合业务线中进行了一系列思考和探索
基于vite多页面实现多端同构开发和部署
背景由于在开发前端项目中,后台管理端和用户端存在多个模块和页面逻辑可以复用,管理模块和用户端渲染模块使用同一套状态管理机制,只是在管理端和用户端的入口和路由模块不同,为了能够在开发时同时修改管理端和用户端共用模块,不用多项目工程修改和发布,我们基于vite
熵桥流沙
熵桥流沙
Lv1
洛阳亲友如相问,一片冰心在玉壶。
文章
5
粉丝
0
获赞
0