你真的懂package.json吗

article/2025/9/27 12:11:06

点击蓝字 「前端小苑」关注我

作者 | MasonEast

编辑 | 桔子酱

前言

在Node.js中,模块是一个库或框架,也是一个Node.js项目。Node.js项目遵循模块化的架构,当我们创建了一个Node.js项目,意味着创建了一个模块,这个模块的描述文件,被称为package.json。

我之前看别人项目中package.json文件的scripts这样写:

"dev": "rimraf \"config/.conf.json\" && rimraf \"src/next.config.js\" && cpx \".conf.json\" \"config/\" && nodemon server/index.ts",
"clean": "rimraf ./dist && mkdir dist",
"prebuild": "npm run clean",
"build": "cross-env NODE_ENV=production webpack"

当时看的有点懵, 于是又补了下相关知识, 发现原来package.json有很多地方被我们忽略了呀, 如果有道友和我一样有点懵的话, 本文不容错过。

bin

它是一个命令名和本地文件名的映射。在安装时,如果是全局安装,npm将会使用符号链接把这些文件链接到prefix/bin,如果是本地安装,会链接到./node_modules/.bin/。

通俗点理解就是我们全局安装, 我们就可以在命令行中执行这个文件, 本地安装我们可以在当前工程目录的命令行中执行该文件。

"bin": {"gynpm": "./bin/index.js"
}

要注意:这个index.js文件的头部必须有这个#!/usr/bin/env node节点, 否则脚本将在没有节点可执行文件的情况下启动。

小实验

通过npm init -y创建一个package.json文件。

{"name": "cc","version": "1.0.0","description": "","main": "index.js","bin": {"mason": "./index.js"},"scripts": {},"keywords": [],"author": "","license": "ISC","dependencies": {}
}

在package.json的同级目录新建index.js文件

#!/usr/bin/env nodeconsole.log('cool')

然后在项目目录下执行:mac下: sudo npm i -g, window下: npm i -g接下来你在任意目录新开一个命令行, 输入mason, 你讲看到

cool字段。

不知道通过这个小实验能不能帮助大家更好的理解这个bin的作用。像我们常用的vue-cli, create-react-app等都是通过bin属性将命令映射到了全局上。

main

main很重要, 它是我们项目的主要入口。

"main": "app.js"

像这样, 我们项目就会以根目录下的app.js文件作为我们的项目入口文件了。

scripts

npm 允许在package.json文件里面,使用scripts字段定义脚本命令。 优点: 项目的相关脚本,可以集中在一个地方。

不同项目的脚本命令,只要功能相同,就可以有同样的对外接口。用户不需要知道怎么测试你的项目,只要运行npm run test即可。可以利用 npm 提供的很多辅助功能。

npm 脚本的原理非常简单。每当执行npm run,就会自动新建一个 Shell,在这个 Shell 里面执行指定的脚本命令。因此,只要是 Shell(一般是 Bash)可以运行的命令,就可以写在 npm 脚本里面。

比较特别的是,npm run新建的这个 Shell,会将当前目录的node_modules/.bin子目录加入PATH变量,执行结束后,再将PATH变量恢复原样。

这意味着,当前目录的node_modules/.bin子目录里面的所有脚本,都可以直接用脚本名调用,而不必加上路径。比如,当前项目的依赖里面有 Mocha,只要直接写mocha test就可以了。

*通配符

*表示任意文件名,**表示任意一层子目录。

"lint": "jshint *.js"
"lint": "jshint **/*.js"

如果要将通配符传入原始命令,防止被 Shell 转义,要将星号转义。

"test": "tap test/\*.js"

脚本传参符号:--

"server": "webpack-dev-server --mode=development --open --iframe=true ",

脚本执行顺序

并行执行(即同时的平行执行),可以使用&符号

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

继发执行(即只有前一个任务成功,才执行下一个任务),可以使用&&符号

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

脚本钩子

npm 脚本有pre和post两个钩子, 可以在这两个钩子里面,完成一些准备工作和清理工作

eg:

"clean": "rimraf ./dist && mkdir dist",
"prebuild": "npm run clean",
"build": "cross-env NODE_ENV=production webpack"

npm 默认提供下面这些钩子:

prepublish,postpublish
preinstall,postinstall
preuninstall,postuninstall
preversion,postversion
pretest,posttest
prestop,poststop
prestart,poststart
prerestart,postrestart

拿到package.json的变量

npm 脚本有一个非常强大的功能,就是可以使用 npm 的内部变量。

首先,通过npm_package_前缀,npm 脚本可以拿到package.json里面的字段。比如,下面是一个package.json。

// package.json
{"name": "foo","version": "1.2.5","scripts": {"view": "node view.js"}
}

我们可以在自己的js中这样:

console.log(process.env.npm_package_name); // foo
console.log(process.env.npm_package_version); // 1.2.5

常用脚本

// 删除目录
"clean": "rimraf dist/*",// 本地搭建一个 HTTP 服务
"serve": "http-server -p 9090 dist/",// 打开浏览器
"open:dev": "opener http://localhost:9090",
// 实时刷新"livereload": "live-reload --port 9091 dist/",// 构建 HTML 文件
"build:html": "jade index.jade > dist/index.html",// 只要 CSS 文件有变动,就重新执行构建
"watch:css": "watch 'npm run build:css' assets/styles/",// 只要 HTML 文件有变动,就重新执行构建
"watch:html": "watch 'npm run build:html' assets/html",// 部署到 Amazon S3
"deploy:prod": "s3-cli sync ./dist/ s3://example-com/prod-site/",// 构建 favicon
"build:favicon": "node scripts/favicon.js",

介绍几个在npm脚本中好用的模块

cpx全局复制

一个很好用的模块, 可以监视全局文件变化, 并将其复制到我们想要的目录

我们使用npm安装就可以在npm的脚本中使用了:

"copy": "cpx \".conf.json\" \"config/\" "

这样我们运行npm run copy就可以将根目录下的.conf.json文件拷贝到config文件夹下了, 如果没有config文件夹就会新建一个。

cpx "src/**/*.{html,png,jpg}" app --watch

当src目录下的任意.html, .png, .jpg等文件发生变化就拷贝到app目录下。

cross-env能跨平台地设置及使用环境变量

大多数情况下,在windows平台下使用类似于: NODE_ENV=production的命令行指令会卡住,windows平台与POSIX在使用命令行时有许多区别(例如在POSIX,使用$ENV_VAR,在windows,使用%ENV_VAR%。。。)

cross-env让这一切变得简单,不同平台使用唯一指令,无需担心跨平台问题:

"start": "cross-env NODE_ENV=production node server/index.js",

dependencies和devDependencies

这两个主要就是存放我们项目依赖的库的地方了, devDependencies主要是存放用于本地开发的, dependencies会在我们开发的时候带到线上。

通过npm i xxx -S会放在dependencies, npm i xxx -D会放在devDependencies。所以我们在装包的时候一定要考虑这个包在线上是否用的到, 不要全都放到dependencies中,增加我们打包的体积和效率。

peerDependencies

我们在一些项目的package.json中看到这个属性, 它主要是考虑兼容问题,通俗点理解, 我们通过这个属性可以告诉要使用我们这个模块的人:

你要使用我, 最好把xxx1, xxx2也带上, 不然我可能会给你带来麻烦的。

"peerDependencies": {"xxx1": "1.0.0","xxx2": "1.0.0",}

这样在装包的时候同时也会, 带上xxx1和xxx2这两个包。

个人觉得比较重要的就是这几个了。还有一些, 像: author, version, keywords, description这些就很好理解了。

参考

npmjs https://docs.npmjs.com/misc/scripts

阮一峰博客 http://www.ruanyifeng.com/blog/2016/10/npm_scripts.html


关于本文

作者:MasonEast

来源:掘金

原文链接:https://juejin.im/post/5dea1095e51d4558083322e2

版权声明:版权归作者所有



更多文章请点击“阅读原文”

喜欢本文点个“在看”哟!


http://chatgpt.dhexx.cn/article/aq7NhFaq.shtml

相关文章

《Linux编程》上机作业 ·004【文件I/O操作】

注:前言、目录见 https://blog.csdn.net/qq_44220418/article/details/108428971 友情提醒:仅供参考理解,请勿直接复制粘贴 友情提醒:仅供参考理解,请勿直接复制粘贴 友情提醒:仅供参考理解,…

CPU比GPU训练神经网络快十几倍,英特尔:别用矩阵运算了

来源丨机器之心 神经网络训练通常是 GPU 大显身手的领域,然而莱斯大学和英特尔等机构对 GPU 的地位发起了挑战。 在深度学习与神经网络领域,研究人员通常离不开 GPU。得益于 GPU 极高内存带宽和较多核心数,研究人员可以更快地获得模型训练的结…

用于基于 CNT 的射频辐射热计开发研究的 CPX-VF 探针台

我们会不时强调我们的低温探针台如何用于有趣的研究。我们最新的应用重点是阿克伦大学领导的工作,并发表在上个月的IEEE 微波理论与技术汇刊上。与来自美国陆军和 Nano-C Inc.(马萨诸塞州 Westwood 的纳米结构碳材料及其应用开发商)的研究人员…

ProJet 3510 CPX蜡模3D打印机在珠宝行业成功应用

传统的首饰设计是一个细致和增量的过程。传统设计从设计师的构图开始,一旦草图被批准后,就会雕刻成模型,如果蜡模没有足够接近原始草图或未能满足客户的期望,必须重做,这样会浪费大量的时间。使用ProJet 3510 CPX专业蜡成型3 d打印机&#xf…

基于 CNT 的射频辐射热计开发研究的 CPX-VF 低温探针台

有时,我们喜欢强调我们的低温探针台如何用于有趣的研究。我们最新的应用重点是由阿克伦大学领导并发表在上个月的IEEE Transactions on Microwave Theory and Techniques 上的工作。UA 的 ZEN-Lab 的Michael Gasper 和 Ryan Toonen 博士与美国陆军和 Nano-C Inc.&am…

Parker驱动器维修COMPAX控制器维修CPX0200H

COMPAX控制器:由不同的模拟功率控制信号,由MOSFET IC级驱动器GND/PGND(功率接地))的信号控制,则应分别接地。使用IC的小信号部分的控制IC,SGND信号与功率地之间的连接点。合理的方法是地信号地返…

用于 CPX、CPX-VF 和 CRX-VF 探针台的新手提箱选项

如果您正在寻找一种简单的方法来将样品从手套箱、干燥箱或其他惰性气氛容器转移到高真空、低温探测环境,您可能会感兴趣:一个新的专用手提箱 (PS-SC- CPX) 与可安装在我们的CPX、CPX-VF或CRX-VF探针台上的负载锁定组件 (PS-LL-CPX) 一起使用。 该手提箱具…

GE IC697CPX935 CPU模块PDF帅

IC697CPX935 是 GE 自动化和控制公司制造的具有三个内置串行端口的单槽 PLC CPU。它能够对系统进行实时控制。使用 VMEC.1 格式,IC697CPX935 可以通过安装在机架上的背板与不同的“智能选项”模块进行通信。该设备通过三位运行/停止控制开关或连接到运行适当软件的计…

micropython仿真器_microbit/cpx 的 python模拟器:Device Simulator Express

Device Simulator Express是一个 VSCode 的编程扩展,使用它无需硬件就能对 Circuit Playground Express(CPX)或 BBC micro:bit 仿真和调试python程序,此外还可以通过串口观察设备的输出。Device Simulator Express 和 makecode 中的设备模拟器功能类似,但它是一个 python 程…

Win10强制更新关闭方法

Win10自动更新怎么永久关闭?有效的Win10强制更新关闭方法 之前小编为大家分享过一些Win10彻底关闭Windows Update自动更新的方法,主要是通过一些如设置流量计费或借助一些专门的小工具来实现,但往往会发现,Win10自动更新就像打不死…

Win10强制更新禁不掉的解决方法

现况 2018年8月之后安装或者更新的win10,现在会出现无法禁用windows update的情况,表现为: 在服务里禁用了windows update服务,后续服务仍能正常启动强制更新。设置“登录”和“恢复”选项卡依然无效。在设置里关闭更新选项无效…

iOS 强制更新

废话不多说,直接上代码 (void)getNewVersion {NSURLRequest *request [NSURLRequest requestWithURL:[NSURL URLWithString:"http://itunes.apple.com/cn/lookup?id1036152564"]];NSURLSessionDataTask *task [[NSURLSession sharedSession] dataTaskW…

uniapp APP端在线升级功能实现讲解——强制或可选升级,下载进度显示

文章目录 概要 需求分析 技术实现梳理 1.是否更新判断: 2.升级弹窗的展示 3.根据升级类型限制操作 4.下载APP监听下载进度 5.下载完自动安装 核心API讲解 1.plus.downloader.createDownload(url,options,completedCallback)(下载) 2.plus.r…

Windows如何一键永远禁止系统更新?

大家好,我是小寻,欢迎关注公众号:工具优选,免费领取优质项目源码和常用工具,还可以加入我的交流群! 一、工具介绍 想必大家也会与小编存在同样的困惑,为啥我电脑上的windows会频繁的强制系统升级?windows…

win10总强制更新?教你永久关闭

win10系统个人觉得还挺好用的,但是有一点非常烦人,就是隔三岔五强制自动更新! 相信也是大部分用户最不喜欢的一点。 更新后,系统可能还会出现一些bug,而且每次更新都要等上一段时间。对于每天工作繁忙的用户来说&…

解决Xshell/Xftp强制升级无法进入问题

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 文章目录 前言 一、首先创建一个Xshell.txt文件,用notepad打开 二、将以下代码复制入.txt文件 1.实例代码 2.保存文件,重命名 3.以管理员身份运行…

杰理强制升级工具4.0使用和原理解析

用那个有8个挡位的烧录工具(4.0工具)的话,默认是走USB的,不是走串口,工具的DP接芯片的DP,工具的DM接芯片的DM,工具的5V接芯片的VBAT(要保证能控制芯片供电通断才能从mask启动&#x…

无视Win11 TPM/英特尔芯片等配置,强制升级Win11

上次我写了一个DEV强制升级的文章,可是DEV版本的Windows11系统很不稳定,软件可能无法正常使用。这篇文以适用于任何电脑。建议看这篇文章哦! 1.下载映像 大家可以在网上找.iso映像,也可以点击此处。 在网站上找到[下载 Windows…

Android版本强制更新

目前的项目之中基本上都会存在版本更新的功能,分为强制更新和推荐更新,其实功能点都是一样的,推荐更新只是增加一个按钮让更新的弹框隐藏掉而已,这里仅记录强制更新的功能首先需要跟接口约定,需要判断是否弹出更新弹框…