【Npm】一文了解透彻package.json里的script字段以及相关知识

本文会从介绍npm run的原理script字段作用node_modules/.bin文件夹是什么

一、什么是npm script

package.json里面定义的scripts字段就是,它的每一个属性都对于一段脚本。

{
  // ...
  "scripts": {
    "build": "node build.js"
  }
}

其中build命令对应的脚本就是node build.js,使用npm run命令,就可以执行。

$ npm run build
# 等同于执行
$ node build.js
1.1npm run的原理

我们在项目当中运行npm run xxx,主要分为以下几步:
1、从package.json当中读取scrips对象。
2、以传给npm run命令的第一个参数作为,在scripts对象当中找到对应的作为接下来要执行的命令,没有找到会报错。
3、执行npm run,就会立马自动创建一个shell,其中只要是shell可以运行的命令,就可以写在npm script当中。
4、将当前目录下的node_modules/.bin这个子目录加入PATH变量(这就意味着,当前目录的node_modules/.bin子目录里的所有脚本,都可以直接用脚本名调用,而不需要加路径)

"test": "mocha test"
// 而不用写成这样
"test": "./node_modules/.bin/mocha test"

5、在这个shell上执行上述命令

npm 脚本的唯一要求就是可以在 Shell 执行,因此它不一定是 Node 脚本,任何可执行文件都可以写在里面。 npm 脚本的退出码,也遵守 Shell 脚本规则。如果退出码不是0,npm 就认为这个脚本执行失败。
1.2bin文件夹

npm install或者我们装包之后,都会发现node_modules下的第一个文件夹就是.bin
binbinary的缩写,里面存放的是可执行的二进制文件。binlinux系统中表示存放标准系统实用程序的目录sbin表示存放标准系统管理文件
在这里插入图片描述
在项目当中node_modules/.bin文件夹下,一个就有三个同名的可执行文件。

  • 没有后缀名的文件: 这个文件通常是一个符号链接(symlink)或者是一个脚本文件,它起到在命令行中执行对应包内可执行文件的作用。这个文件在不同的操作系统下可能表现为不同的文件类型。
  • 后缀名为.cmd的文件: 这是一个Windows系统下的命令脚本文件。它是为了在Windows命令行中执行对应包内可执行文件而存在的。
  • 后缀名为.ps1的文件: 这是一个PowerShell脚本文件,通常用于在Windows PowerShell环境中执行对应包内可执行文件。

这些文件的作用是为了让项目中安装的Node.js包内的可执行文件能够在不同的操作系统和命令行环境中被正确执行。在使用·npm install·安装包的时候,npm会根据你的操作系统和命令行环境在.bin文件夹中创建相应的文件。这样,你就可以通过在命令行中运行这些文件来调用项目中依赖包的可执行文件。实质上都是用node执行一个js文件。

package.json文件中有一个bin字段,当我们使用npm安装一个依赖包的时候,如果该包使用了这个bin字段,那么将会自动在我们项目当中的node_modules/.bin目录里面生成指向依赖包bin字段的软链接执行文件。

1.3 #!/usr/bin/env xxx是什么?

我们需要将它拆成三部分来看:

#! 这一部分叫做shebang,这个符号通常在Unix系统的基本中第一行开头中出现,用于指明这个脚本文件的解释程序。

/usr/bin/env 这一部分是路径,指明系统去那个目录下查找到脚本解释器,而/usr/bin/env就是告诉系统去PATH目录中查找,/usr/bin 是系统中的一个二进制目录,其中存放了许多系统级别的可执行文件,/usr/bin/env 实际上是一个用于寻找系统环境变量中指定的可执行程序的工具,而 env 是一个寻找环境变量中指定程序的工具。

xxx 这一部分是指定解释器,这里node就是在使用环境当中找到node.js解释环境,这里我们可以指定我们想要用的解释器。
例如:
在这里插入图片描述
这个就是指定powershell解释器

!# usr/bin/env node的意思是让系统动态的去查找node,可以解决不同机器不同用户设置不一致的问题。

关于这个的具体细节大家可以在stackoverfolw当中去详细阅读:
阅读1、阅读2

它的主要用途:
有时候我们会自主分装一些或者脚手架,就可以通过这个命令同时配合package.json文件中的bin字段让node_modules/.bin进行一个软链接,去自主执行我们的入口文件去运行整个代码。

二、为什么需要npm script

好处:

  • 编写单一职责的命令,提高代码的复用性
  • 不同项目的脚本,只要功能相同,就可以有相同的对外接口,提升可读性、降低项目的门槛
  • 通过连接多个命令,可以打造自动化的工作流

三、如何使用npm script

3.1执行多个命令

1、串行执行
&& 来连接多个命令,前面命令执行完成才再执行后面的

$ npm run script1.js && npm run script2.js

2、并行执行
& 来同时平行执行

$ npm run script1.js & npm run script2.js
3.2 生命周期钩子

npm script是具有生命周期机制的,具体来说就是pre和post

  • pre:用于在某些动作之前执行其他的动作
  • post:用于在某些动作之后执行其他的动作

npm默认提供以下钩子
prepublish,postpublish
preinstall,postinstall
preuninstall,postuninstall
preversion,postversion
pretest,posttest
prestop,poststop
prestart,poststart
prerestart,postrestart

执行npm run build时,会分3个阶段串行执行
1、检查是否存在prebuild命令,如果有,就执行该命令,否则进入第2阶段
2、检查是否存在build命令,如果有,就执行运行build命令,若执行成功则进入第3阶段,否则就会报错
3、检查是否存在postbuild命令,如果有,就执行该命令

3.3 使用npm变量

1、自定义变量
使用 “config” 字段:
你可以在 package.json 文件中的 “config” 字段下定义自己的变量,然后在脚本中使用。

"config": {
  "myVariable": "custom-value"
},
"scripts": {
  "example": "echo $npm_package_config_myVariable"
}

这里定义了一个名为 “myVariable” 的自定义变量,然后在脚本中使用 $npm_package_config_myVariable 引用它。

2、预定义变量
npm当中内置了很多变量,可以通过执行npm run env来查看完整的预定义变量列表
js读取变量,通过process.env对象来读取就可以

3.4 添加注释

在执行npm script的时候会产生一些日志输出,我们也可以添加一些自己的注释。

添加的方法就是直接在命令前面添加:
unix 系统上,可以使用 # 注释:

{
  "scripts": {
    "start": "echo 'Start script'",
    "build": "echo 'Build script'",
    "custom-comment": "# This is a custom comment\n echo 'This is a custom comment'"
  }
}

windows系统上,可以使用 REM 注释:

{
  "scripts": {
    "start": "echo 'Start script'",
    "build": "echo 'Build script'",
    "custom-comment": "REM This is a custom comment\n echo 'This is a custom comment'"
  }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

6.3.5编辑视频

6.3.5编辑视频 除了上面的功能外,Camtasia4还能进行简单的视频编辑工作,如媒体的剪辑、连接、画中画等。 下面我们就利用Camtasia4的强大功能来实现一个画中画效果,在具体操作之前,需要准备好两个视频文件,一个作为主…

docker:Java通过nginx获取客户端的真实ip地址

问题现象 我们的平台使用Spring Cloud微服务架构,使用Spring Boot构建Java服务,使用google的jib插件打成docker镜像包我们使用docker虚拟化部署,使用docker-compose统一管理所有服务,包括Java服务和nginx等组件我们前后端分离&am…

蓝天采集器,功能逆天的网站数据抓取神器,轻松助你成为采集达人,附带搭建配置文档

源码介绍 蓝天采集器是一款专为web服务器打造的数据采集神器。与市面上常见的桌面端采集工具(如火车头等)相比,蓝天采集器在易用性、上手成本和灵活性方面更胜一筹。它部署简便,无需复杂的设置,即可迅速融入您的web服…

路由器初始化配置、功能配置

实验环境 拓扑图 Ip规划表(各组使用自己的IP规划表) 部门 主机数量 网络地址 子网掩码 网关 可用ip Vlan 市场部 38 192.168.131.0 255.255.255.0 192.168.131.1 2-254 11 研发部 53 192.168.132.0 255.255.255.0 192.168.132.1 2-2…

浅析CXL P2P DMA加速数据传输拥堵问题的解决方案

接上文:CXL P2P DMA加速数据传输的拥堵问题 为了改善这个问题,CXL 3.0引入了Unordered-IO和Back Invalidate Snoop新机制,允许更直接和高效点对点数据传输,以减轻上游CXL通道的压力并减少延迟。 (1)Unordered-IO (UIO) 在传统PCI…

Java如何做到无感知刷新token含示例代码(值得珍藏)

1. 前言 在系统页面进行业务操作时,有时会突然遇到应用闪退,并被重定向至登录页面,要求重新登录。此问题的出现,通常与系统中用于存储用户ID和token信息的Redis缓存有关。具体来说,这可能是由于token过期所导致的身份…

shell编程-3

文章目录 shell学习第三天while 循环第一天的小游戏练习: 编写抽同学回答问题的脚本要想让这个脚本永久有效如何知道两个文件里的内存一样?如何判断某个人已经抽过了 文本处理相关命令seqxargsuniqsorttrcutawkpastesplitcoljoin小结一下作业 小知识点写脚本的流程怎…

【蓝桥杯EDA设计与开发】资料汇总以及立创EDA及PCB相关技术资料汇总(持续更新)

[18/01/2024]:目前为了准备蓝桥杯做一些资料贴,于是写下这一篇博客。 各种资料均来源于网络以及部分书籍、手册等文档,参考不保证其准确性。 如果在准备蓝桥杯,可与我私信共同学习!!!&#xf…

【人工智能课程】计算机科学博士作业一

【人工智能课程】计算机科学博士作业一 1 任务要求 模型拟合:用深度神经网络拟合一个回归模型。从各种角度对其改进,评价指标为MSE。掌握技巧: 熟悉并掌握深度学习模型训练的基本技巧。提高PyTorch的使用熟练度。掌握改进深度学习的方法。 …

sc.pl.umap 画feature plot

今天有时间尝试测试了这个scanpy的feature plot,其实很简单,就是使用 sc.pl.umap(adata,color"gene name"), 但是这个地方就有一个问题,这个画出来的值是原始的基因值还是scale之后的,这个我得搞清楚 首先看使用例子,参…

Linux shell编程学习笔记40:stat命令

程序员必备的面试技巧 “程序员必备的面试技巧,就像是编写一段完美的代码一样重要。在面试战场上,我们需要像忍者一样灵活,像侦探一样聪明,还要像无敌铁金刚一样坚定。只有掌握了这些技巧,我们才能在面试的舞台上闪耀…

QT-贪吃小游戏

QT-贪吃小游戏 一、演示效果二、关键程序三、下载链接 一、演示效果 二、关键程序 #include "Snake.h" #include "Food.h" #include "Stone.h" #include "Mushroom.h" #include "Ai.h" #include "Game.h" #inclu…

[Linux 进程(五)] 程序地址空间深度剖析

文章目录 1、前言2、什么是进程地址空间?3、进程地址空间的划分4、虚拟地址与物理地址的关系5、页表的作用扩展 6、为什么要有地址空间? 1、前言 Linux学习路线比较线性,也比较长,因此一个完整的知识点学习就会分布在两篇文章中&…

zabbix客户端配置及自定义监控

部署zabbix客户机 1.服务端和客户端都配置时间同步 yum install -y ntpdate ntpdate -u ntp.aliyun.com 2.服务端和客户端都设置 hosts 解析 cat > /etc/hosts << EOF 172.16.23.16 localhost 172.16.23.17 zbx-server EOF 3.被监控端 //设置 zabbix 的下载源&…

年龄性别预测1:年龄性别数据集说明(含下载地址)

年龄性别预测1&#xff1a;年龄性别数据集说明(含下载地址) 目录 年龄性别预测1&#xff1a;年龄性别数据集说明(含下载地址) 1.前言 2.MegaAge_Asian 3.MORPH 4.IMDB-WIKI 5.数据集下载 6.年龄性别预测和识别(Python/C/Android) 1.前言 本项目将实现年龄性别预测和识…

『 C++ 』红黑树RBTree详解 ( 万字 )

文章目录 &#x1f996; 红黑树概念&#x1f996; 红黑树节点的定义&#x1f996; 红黑树的插入&#x1f996; 数据插入后的调整&#x1f995; 情况一:ucnle存在且为红&#x1f995; 情况二:uncle不存在或uncle存在且为黑&#x1f995; 插入函数代码段(参考)&#x1f995; 旋转…

【C++入门】C++ STL中string常用函数用法总结

目录 前言 1. string使用 2. string的常见构造 3. string类对象的访问及遍历 迭代器遍历&#xff1a; 访问&#xff1a; 4. string类对象的容量操作 4.1 size和length 4.2 clear、empty和capacity 4.3 reserve和resize reserve resize 5. string类对象的修改操作 push_back o…

version-polling一款用于实时检测 web 应用更新的 JavaScript 库

为了解决后端部署之后&#xff0c;如何通知用户系统有新版本&#xff0c;并引导用户刷新页面以加载最新资源的问题。 实现原理 1.使用 Web Worker API 在浏览器后台轮询请求页面&#xff0c;不会影响主线程运行。 2.命中协商缓存&#xff0c;对比本地和服务器请求响应头etag字…

施耐德PLCTM200CE 如何实现远程上传下载程序?

准备工作 一台可联网操作的电脑一台单网口的远程透传网关及博达远程透传配置工具网线一条&#xff0c;用于实现网络连接和连接PLC一台施耐德TM200CE PLC及其编程软件一张4G卡或WIFI天线实现通讯(使用4G联网则插入4G SIM卡&#xff0c;WIFI联网则将WIFI天线插入USB口&#xff0…

Unity3D和three.js的比较

一、Unity3D和three.js简介 Unity3D是一款跨平台的游戏引擎,可以用于开发2D和3D游戏。它提供了一个可视化的开发环境,包含了强大的编辑器和工具,使开发者可以方便地创建游戏场景、添加物体、设置物理效果、编写脚本等。Unity3D支持多种平台,包括PC、移动设备、主机等,可以…