实现 node_modules 共享

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!

时间: 2024-11-07 11:41:35

实现 node_modules 共享的相关文章

ANSI_common-lisp

前言 本书的目的是快速及全面的教你 Common Lisp 的有关知识.它实际上包含两本书.前半部分用大量的例子来解释 Common Lisp 里面重要的概念.后半部分是一个最新 Common Lisp 辞典,涵盖了所有 ANSI Common Lisp 的操作符. 这本书面向的读者 ANSI Common Lisp 这本书适合学生或者是专业的程序员去读.本书假设读者阅读前没有 Lisp 的相关知识.有别的程序语言的编程经验也许对读本书有帮助,但也不是必须的.本书从解释 Lisp 中最基本的概念

删除顽固node_modules

在工作中有用到gulp,webpack,使用他们需用依赖node的一些模块包,于是会在目录下生成一个node_modules文件夹.有一次想删掉它重新生成模块包的时候发现根本不太可能,无穷无尽的报一个错:路径太长(太深),无法删除,使用命令行rd.del均尝试无效(此问题win10系统下已不会出现,小伙伴们赶紧更新系统吧). 一开始我只能通过另起文件夹的做法来重新启用新项目,发现僵尸文件越来越多,几翻周折,终于找到解决方法.步骤如下: 新建空白目录,如 D:\Study\emptyDir: 管理

samba共享目录构建wordpress与mysql

项目一 (1) 使用samba共享/data/application/web,在目录中提供wordpress; (2) 使用samba客户端挂载samba server共享的目录至/var/www/html: (3) 客户端(lamp),部署wordpress,并让其正常访问:要确保能正常发文章,上传图片: (4) 客户端2(lamp),挂载samba server共享的目录至/var/www/html:验正其wordpress是否可被访   问:要确保能正常发文章,上传图片: samba服务器

Nginx做负载均衡时session共享问题详解

用nginx做负载均衡时,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,就会出现很多问题,比如说最常见的登录状态. 再者Nginx连接Memcached集群时,Nignx的请求从memcached服务器中根据key获得了value则直接返回value,如果没有获得到value则去MySQL中查询再返回. location / { set $memcached_key "$request_uri"; #设置请求memcached服务器的key memca

Linux共享对象之编译参数fPIC(转)

最近在看Linux编程的基础知识,打算对一些比较有趣的知识做一些汇总备忘,本文围绕fPIC展开,学习参考见文末. 在Linux系统中,动态链接文件称为动态共享对象(DSO,Dynamic Shared Objects),简称共享对象,一般是以.so为扩展名的文件.在Windows系统中,则称为动态链接库(Dynamic Linking Library),很多以.dll为扩展名.这里只备忘Linux的共享对象. 在实现一共享对象时,最一般的编译链接命令行为: g++ -fPIC -shared t

vmware联网解决方案:host-only共享上网

一.需求说明 vmware通过桥接的方式可以上外网,但是虚拟机的IP地址必须和物理网卡在同一网段,上网环境不同虚拟机必须跟着换ip地址很麻烦,所以最好是采用host-only方式上网. 特别是做架构实验的时候,如果设置双网卡...经常会出各种问题,用host-only这种方式则简单多了,既能在不同网络环境下使用固定的IP地址,又能访问内外网. 一般情况下host-only模式只是虚拟机和主机之间建立的网络,仅对主机可见,但是通过Windows系统的主机上使用Internet连接共享功能,则可以让

ii 第七单元 访问网络共享文件系统

挂载网络文件系统 网络文件系统是由网络附加存储服务器通过网络向多个主机提供的一种文件系统 , 而不是由块设备 ( 例如硬盘驱动器 ) 提供的.客户端通过特殊的文件系统协议和格式访问远程存储 Linux 中有两种主要协议可用访问网络文件系统 : NFS 和CIFS . 访问网络共享的三个基本步骤– 1. 识别要访问的远程共享– 2. 确定挂载点 ( 应该将共享挂载到的位置 ), 并创建挂载点的空目录– 3. 通过相应的名利或配置更改挂载网络文件系统 1.cifsCIFS( Comon Intern

Redis主从复制实现session共享

一.Redis安装 1. 下载安装扩展源及源码包 yum install -y epel-release jemalloc-devel wget https://codeload.github.com/antirez/redis/tar.gz/2.8.21 tar -zxvf 2.8.21 make:make PREFIX=/usr/local/redis install mkdir -p /usr/local/redis/etc 解决办法: cd deps/ make hiredis lua

VMWare ESXi 6 创建共享磁盘

目的:创建4块10G大小共享磁盘,挂载到rhel-6.5-node1.rhel-6.5-node2服务器上 1.在rhel-6.5-node1上添加磁盘 2.选择"创建新的虚拟磁盘" 3.设置容量.磁盘置备和位置 4.选择虚拟设备节点为SCSI(1:0),模式 4.添加完成 5.添加按步骤1-4添加另外三块磁盘,虚拟设备节点依次为SCSI(1:1),SCSI(2:0).SCSI(2:1) 6.设置2块新的SCSI控制器SCSI总线共享为"虚拟" 7.在rhel-6.