使用 npm link 测试本地编写的 node 模块 / 引入全局安装的 node 模块

news2024/9/25 13:18:01

目录

1. npm install VS npm install -g

2. npm install -g 的本质?映射脚本的作用?

3. 如何测试使用未发布的 npm 包?npm link 原理?

4. link 到项目

4.3 link 到项目有两种情况(项目和模块是否在同一目录)

4.3.1 当项目和模块在 相同 目录下,可以使用相对路径,只需 link 一次

5. 通过 npm link,测试本地编写的 node 模块

5.1 创建待测试 node 模块,生成 package.json

5.2 创建真实项目,运行报错找不到待测试 node 模块

5.4 在 project 目录下,连接项目和待测试 node 模块

5.5 运行项目,查看 项目 和 待测试 node 模块 连接效果

6. 通过 npm link,在项目中使用全局安装的模块

7. 为什么全局安装的模块,不能直接 require,而要通过 npm link 呢?

8. 参考文章


1. npm install VS npm install -g

npm install 可以把发布在 npmjs 平台上的模块包,下载到本地项目中

npm install -g 可以把包下下来的同时,还帮我们配置好全局变量:

  • 此时可以直接使用命令运行,比如 nrm use
  • 避免了通过 node 执行,比如 node nrm ...
  • 也避免了配置 package.json 的 script 脚本来执行,比如 "script": "node nrm ..."

以上内容,仅限于已经发布的包;

2. npm install -g 的本质?映射脚本的作用?

在 mac 中,在终端可以直接使用的命令(比如 nrm),其实是在执行 /usr/local/bin 目录下的脚本(/usr/local/bin 是 全局命令 所在的地方);

在执行 npm install -g 的时候,相关依赖会被安装在 /usr/local/lib/node_modules 目录下;

在 /usr/local/bin 目录下,不仅存储了全局命令,还有一个映射脚本;

映射脚本会把 npm install -g 安装的内容,指向 /usr/local/lib 下的真实文件;(优点:实现了只有一份可执行文件的前提下,给命令取别名)

3. 如何测试使用未发布的 npm 包?npm link 原理?

1 中说了,npm install 和 npm install -g,仅限于已经发布的包

那么如何测试使用未发布的 npm 包呢?难道要把一个未经测试的包发布到 npm,然后 install 下来测试吗?

当然不能这么做,npm 官方提供了 测试本地包 的工具指令:npm link

 

npm link 可以帮助我们模拟包安装后的状态,它会在系统中做一个快捷方式映射,让本地的包就好像 install 过一样,可以直接使用

 

npm link 做的事情,和 2 中 npm install -g 做的事 基本一致,区别在于:

  • npm link 在 /usr/local/lib 下的 node_modules 里不是存的真实的文件,而是存了一个快捷方式
  • 该 快捷方式 指向当前执行 npm link 的目录
  • 如果开发的是 node 包,则执行的命令名和真实执行的文件入口,会根据项目 package.json 里 bin 的配置来获取

 

4. link 到项目

如果编写的 node 模块,是单独的一个项目,不和其他的项目在同一个目录下

为了让其他目录下的项目,使用 node 模块,需要将 node 模块 link 到全局 

 

 npm link 前,需要在 node 模块的 package.json 里,配置 bin 字段

"bin" : {  
	"your-command-name": "./path-to/your-command-entry-file"
}

 

在 node 模块目录下,执行 npm link(全局 link 不需要添加任何参数哦)

cd your-command-module
npm link

成功后,就可以在 终端 执行全局命令 your-command-name 了

测试完待测试 node 模块后,记得要解除全局 link,不然全局 node_modules 内的快捷方式太乱了

解除模块全局 link —— 进入模块目录,执行 unlink

cd your-command-module
npm unlink your-command-module

解除项目和模块 link —— 进入项目目录,执行 unlink

cd your-project
npm unlink your-ui-lib

4.3 link 到项目有两种情况(项目和模块是否在同一目录)

如果是测试前端包,跑在浏览器环境的,比如 UI 组件库,有两种情况

4.3.1 当项目和模块在 相同 目录下,可以使用相对路径,只需 link 一次

npm link ../xx-module

 

进入待测试组件库目录,将组件库 link 到全局

cd your-ui-lib
npm link

进入要使用该组件库的工程,在工程中 link 组件库 

cd your-project
npm link your-ui-lib 

现在就可以在 工程 中使用 组件库,就好像 组件库 被 install 到工程中一样

5. 通过 npm link,测试本地编写的 node 模块

创建一个项目 npm-link-test,该项目包含了两部分内容:

  • 自己编写的待测试的 node 模块
  • 真实项目,该项目将安装并使用上面的 node 模块

项目基本结构:

 

5.1 创建待测试 node 模块,生成 package.json

module.exports = {
    name: "LyrelionNodeModules",
    sayHello: function(){
        console.log("hello LyrelionNodeModules");
    }
}

 

使用 npm init -y 可以自动生成 package.json 并命名,像这样:

{
  "name": "lyrelion-node-modules",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

 

5.2 创建真实项目,运行报错找不到待测试 node 模块

执行 node demo.js,不出意外的报错了,找不到 LyrelionNodeModules 模块,这是因为 require 当前的搜寻目录里,没有 LyrelionNodeModules 模块

 

切换到 LyrelionNodeModules 目录下,执行 npm link,开启全局 link

 

我们知道,npm link 命令的作用是:

  • 在全局环境下,也就是 Node.js 安装目录下的 node_modules 目录下,生成一个符号链接文件(就是创建一个快捷方式文件)
  • 该文件的名字就是 LyrelionNodeModules 目录下 package.json 文件中指定的模块名

 

 

因为,它是一个快捷方式,所以无论在 LyrelionNodeModules 下修改了什么东西,都会实时更新

5.4 在 project 目录下,连接项目和待测试 node 模块

执行 npm link lyrelion-node-modules,就可以连接 项目 和 待测试 node 模块 了

 

看,此时项目下面生成了 node_modules!

5.5 运行项目,查看 项目 和 待测试 node 模块 连接效果

执行 node demo.js 还是报错了

因为待测试第三方模块里,没指定 bin,所以默认的名字是 中划线形式,而我最初写的是 大驼峰形式,把大驼峰改成中划线即可,打印效果也对了

 

移除项目和模块的 link:进入项目目录下,执行 npm unlink lyrelion-node-modules

此时,node_modules 中的 待测试 node 模块包,被移除了

 

移除 待测试 node 模块全局 link:进入待测试 node 模块目录下,执行 npm unlink lyrelion-node-modules

6. 通过 npm link,在项目中使用全局安装的模块

5 中,npm link 自己写的模块,但大部分情况下,我们都是要引用别人写好的模块,此时也可以通过 npm link 简化操作

假设现在有 A、B 两个项目,都使用了 Coffee-script 模块:

首先,将 Coffee-script 安装到全局

npm install coffee-script -g # 全局安装 Coffee-script

 

其次,在每一个要开发的应用中,连接全局安装的  Coffee-script

cd A

npm link coffee-script # 把全局安装的 Coffee-script 模块,链接到 A 的 node_modules 下

cd B

npm link coffee-script # 把全局安装的 Coffee-script 模块,链接到 B 的 node_modules 下

 

更新全局安装的 Coffee-script,则 A、B 中的依赖也自动更新了

npm update coffee-script -g # 更新全局安装的 Coffee-script,所有 link 的项目同时更新了

7. 为什么全局安装的模块,不能直接 require,而要通过 npm link 呢?

可能会有人疑问:

  • 不是说全局安装的包,在每一个项目中都可以用吗?
  • 为啥这里全局安装了 Coffee-script,在具体的项目中,却还需要 npm link 进行使用呢?

 

注意以下几点:

  • npm install -g moduleName 是将模块装到 全局目录 下
  • 全局安装的模块,是供命令行(command line)使用的,比如 grunt
  • 全局安装的模块,不可以用 require 调用包,而项目中需要 require,所以需要 npm link 一下

8. 参考文章

npm link详解 | ChampYin's Blognpm install 可以把发布在 npmjs 平台上的模块包下载到本地,npm install -g 可以把包下下来的同时,还帮我们配置好全局变量,让我们可以直接使用命令而不是通过 node 来执行或者配置 package.json 的 script 脚本来 run。 但这仅限于已经发布的包,那对于未发布的包,要怎么测试使用呢?难道要把一个未经测试的包发布上去然后 install 下来测试?https://champyin.com/2019/08/27/npm-link%E8%AF%A6%E8%A7%A3/ npm link的用法 - zhangzl419 - 博客园npm link的用法 假如我们想自己开发一个依赖包,以便在多个项目中使用。 一种可行的方法,也是npm给我们提供的标准做法,那就是我们独立开发好这个依赖包,然后将它直接发布到npm镜像站上去,等以后https://www.cnblogs.com/zhangzl419/p/15210835.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/131469.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ansible 第二天

要求: 安装并且配置ansible 1)安装和配置ansible以及ansible控制节点server.example.com如下: 2)创建一个名为/home/student/ansible/inventory的静态库存文件如下所示: 2.1)node1 是dev主机组的成员 2.2)node2是test主机组的成员 2.3)node1和…

什么是 Loader、手写 Webpack Loader

目录 1. 什么是 Loader 1.1 Loader 工作原理 1.2 Loader 执行顺序 1.3 内联 Loader 前缀​​​​​​​ 2. 如何开发 Loader 2.1 Loader 长什么样子 2.2 配置本地 Loader 的四种方法 2.2.1 在配置 rules 时,指定 Loader 的绝对路径 2.2.2 在 resolveLoader…

Windows配置万德(Wind)量化接口

原理:wind会在python的第三方库中安装一个属于wind的库 文章目录步骤1:确定python的路径步骤2:配置wind的接口步骤3:检查配置步骤4:使用python提取任意的wind数据步骤1:确定python的路径 如果是默认安装,一般路径是:C:\Users\用户名\Anacond…

磨金石教育摄影技能干货分享|优秀作品欣赏—技巧十足的艺术摄影

想要赏析艺术类的摄影,就得立足于画面身后的意蕴,想作者所想,思作者所思。 这有一定的难度,但也不乏趣味。 今天我们就再来看一组艺术类摄影作品,看看作者如何用高明的技巧表达自己心中的感受吧。 1、江苏省-李玉龙-《…

表白墙 -- 前后端代码详解

表白墙 -- 前后端代码详解一、前端二、后端实现2.1 需求2.2 创建项目及初始化2.3 实现提交数据 (存档)2.3.1 实现 doPost2.3.2 构造请求 (修改 html 文件)2.3.3 验证2.4 实现获取数据 (读档)2.4.1 实现 doGet2.4.2 构造请求 (修改 html 文件)2.4.3 验证三、JDBC 版本 (MySQL)3.…

回味2022

回味20221.前言2.过去的十二个月3.我期望的20231.前言 2021年写给自己的总结:回味2021 一年又一年飞逝的光阴,我想唯有时间留给人的印象最为深刻吧。春去秋来,四季轮回间都是时光的印记。2022年12月30日,25岁的我依旧在这间写下2…

从socket开始讲解网络模式

从socket开始讲解网络模式 windows采用IOCP网络模型,而linux采用epoll网络模型(Linux得以实现高并发,并被作为服务器首选的重要原因),接下来讲下epoll模型对网络编程高并发的作用 简单的socket连接 socket连接交互的…

LaoCat带你认识容器与镜像(一)

准备更新一个容器与镜像相关的系列,从Docker到K8s的入门再到实际项目进阶应用,这里感谢好朋友泽鹏,是他让我结识容器与镜像;也感谢上家公司菲恩曼,是它给了我去学习、实践的机会;最后感谢翼哥,一…

Linux系统下at任务调度机制

Linux系统下at任务调度机制 基本介绍 at命令是一次性定时计划任务,at 的守护进程 atd 会以后台模式运行,检查作业队列来运行。默认情况下,atd 守护进程每60秒检查作业队列,有作业时,会检查作业运行时间,如果…

深入理解计算机系统_可重定位目标文件的格式---elf格式

本篇笔记记录可重定位目标文件的格式— elf格式,也是《深入理解计算机系统》第7章的内容。了解这些内容,对我们很有帮助,比如代码排错,可以深入了解C/C 实现原理。 分别介绍如何得到可重定位目标文件及其格式。 2.1 如何得到可重…

操作系统~Linux~线程的互斥,mutex互斥锁的使用及其原理

1.一些基本概念 1.临界资源:凡是被线程共享访问的资源都是临界资源(多线程、多进程打印数据到显示器,显示器就是临界资源) 2.临界区:代码中访问临界资源的代码(在代码中,…

kotlin学习笔记之注解与反射

一、声明并应用注解 一个注解允许你把额外的元数据关联到一个声明上。然后元数据就可以被相关的源代码工具访问,通过编译好的类文件或是在运行时,取决于这个注解是如何配置的。 1、应用注解 在kotlin中使用注解的方法和java一样。要应用一个注解&#xf…

如何通过3个月自学成为网络安全工程师!

前言: 趁着今天下班,我花了几个小时整理了下,非常不易,希望大家可以点赞收藏支持一波,谢谢。 我的经历: 我 19 年毕业,大学专业是物联网工程,我相信很多人在象牙塔里都很迷茫&…

Pycharm配置关于pyside6的外部工具

文章目录一、前言二、Pycharm配置1、designer.exe(1)打开Pycharm的设置(2)相关参数(可复制粘贴)2、Pyside6-uic.exe(1)设置(2)相关参数(可复制粘贴…

Java--抽象类和接口的区别

今天是22年最后一天了, 写篇博客记录一下吧, 这一年发生了很多事情, 也学到了很多知识, 后面要继续加油啊, 大家也要加油啊, 米娜桑. 目录 概述 区别 1. 定义关键字不同 2. 继承或实现的关键字不同 3. 子类扩展的数量不同 4. 属性访问控制符不同 5. 方法控制符不同 6.…

python互联网程序设计GUI程序设计和网络程序设计(人机互动聊天软件)

1.项目意义 1、了解网络的结构; 2、了解网络传输协议; 3、掌握基本的网络编程方法。 2.总体设计 使用 TCP 协议实现人机聊天互动,程序具有服务端和客户端: (1)必备功能&#xff1…

Java财务在线咨询网站系统财务咨询网

简介 财务咨询网站,可以咨询公司代办,代理记账等一系列的财务问题的资讯服务网站 演示视频 https://www.bilibili.com/video/BV1T54y1H7Ar/?share_sourcecopy_web&vd_sourceed0f04fbb713154db5cc611225d92156 角色 管理员客服注册用户游客 技术…

Spring之DI入门案例

目录 一:DI入门案例实现思路分析 1.要想实现依赖注入,必须要基于 IOC 管理 Bean 2.Service 中使用 new 形式创建的 Dao 对象是否保留 ? 3.Service 中需要的 Dao 对象如何进入到 Service 中 ? 4.Service 与 Dao 间的关系如何描述 ? 二&#xff1…

(Qt) cmake编译Qt项目

文章目录前言环境cmake基础预备的项目代码文件资源路径demo.promain.cppres.qrcmywidget.cppmywidget.hmywidget.ui运行效果CMake文件资源路径CMakeLists.txt生成与构建END前言 通常我们在编写qt的时候都是在Qt creator中。而如何在VS Code中编写qt就是本文需要解决的问题 环…

顺序表 —— 初始化、销毁、打印、增加、删除、查找、修改

1.何为线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…线性表在逻辑上是线性结构,也就说是连续的一条直…