node package.json,nodejs package
本文带你浏览一下节点项目中的package.json配置文件,说说package.json中一些常见的配置属性,环境相关属性,依赖相关属性,三方属性,希望对你有帮助!
node.js速度课程简介:进入学习
Npm是前端开发者广泛使用的包管理工具。package.json用于管理依赖于项目的npm包的配置。Package.json是一个json文件。除了能够描述项目的包依赖关系之外,它允许我们使用语义版本规则来指示您的项目的依赖包的版本,以便您的构建可以更好地与其他开发人员共享和重用。
基于最近的实践,结合npm和node的最新版本,介绍package.json中的一些常见配置,以及如何编写一个标准化的package.json。
一、package.json
1. package.json简介
在nodejs项目中,package.json是管理其依赖项的配置文件。通常,当我们初始化一个nodejs项目时,我们会传递:
Npm init将在您的目录中生成3个目录/文件,node_modules、package.json和package.lock.json,其中package.json的内容是:
{
名称:您的项目名称,
版本: 1.0.0 ,
“描述”:“您的项目描述”,
main: app.js ,
脚本:{
测试:回显错误:未指定测试退出1 ,
},
作者:作者姓名,
许可证: ISC ,
依赖项:{
“依赖性1”:^1.4.0,
《依赖2》:^1.5.2
}
}从上面可以看出,package.json包含了项目本身的元数据,以及项目的子依赖项的信息(比如依赖项等。).
2. package-lock.json
我们发现npm init的时候,不仅生成了package.json文件,还生成了package-lock.json文件。那为什么在package.json清零的情况下还需要生成package-lock.json文件呢?本质上,package-lock.json文件用于锁定版本。例如,package.json中指定的子npm包是react: ^16.0.0.在实际安装中,任何高于react的版本都符合package.json的要求,这样,根据同一个package.json文件,无法保证两个安装的子依赖版本一致。
包锁文件如下所示,其版本由子依赖dependency1详细指定。充当锁版本。
{
名称:您的项目名称,
版本: 1.0.0 ,
“lockfileVersion”:1,
requires: true,
依赖项:{
相关性1 :
版本: 1.4.0 ,
已解决:
https://registry . NPM js . org/dependency 1/-/dependency 1-1 . 4 . 0 . tgz ,
“完整性”:
sha 512-a uqth 4 kgzg/slgvfbzdhpgru 7 aaqomqrhjnxhrzickfut 91 brvhnnt 58 cmwu 9 psbbv 3 pdczuhbvxudih 2 MTA==
},
相关性2 :
版本: 1.5.2 ,
已解决:
https://registry . NPM js . org/dependency 2/-/dependency 2-1 . 5 . 2 . tgz ,
“完整性”:
sha 512-won 21 V8 ahye 1 qqvfpifxe 3 tupjac 1 xgkptb 4 iagt 6 o p2cageoowixmftr 4 ZC ti 6d 551 ij 9j 61 DFR 0 NSP 2 uq==
}
}
}
二、package.json常用属性
本章先说一下package.json中常用的配置属性名称、版本等属性太简单,不一一介绍了。本章主要介绍脚本、bin和workspaces属性。
2.1 script
npm中使用脚本标记来定义脚本。每当运行npm时,都会自动创建一个Shell脚本。这里需要注意的是,新创建的npm run will将添加node_modules/。将本地目录的子目录保存到PATH变量中。
这意味着node_modules/中的所有脚本。可以直接用脚本名调用当前目录的bin子目录,不需要添加路径。比如当前项目的依赖项中有esbuild,直接写esbuild xxx就可以了。
{
//.
脚本:{
build: esbuild index.js ,
}
}{
//.
脚本:{
生成“:”。/node_modules/。 bin/esbuild index.js
}
}以上两种写法是等价的。
2.2 bin
bin属性用于将可执行文件加载到全局环境中。一旦全局安装了具有指定bin字段的npm软件包,它将被加载到全局环境中,并且可以通过别名执行该文件。
例如@bytepack/cli的npm包:
bin: {
bytepack“:”。/bin/index.js
},一旦全局安装了@bytepack/cli,就可以通过bytepack直接执行相应的命令,比如
bytepack -v
//显示1.11.0自动连接到node_module/。如果没有全局安装,则为项目的bin目录。和前面介绍的script标签里说的是一致的,可以直接用作别名。
2.3 workspaces
Monorepo最近越来越受欢迎,当项目太大的时候。说到monorepo,我们不需要看工作区。早期我们用的是yarn工作区,现在npm正式支持工作区。
Workspaces解决了如何管理本地文件系统中一个顶层根包下的多个子包的问题。工作区声明目录中的包将被软链接到顶级根包的node_modules。
直接拿官网的例子来说明:
{
名称:我的项目,
工作区:[
包/a
]
}在一个名为my-project的npm包中,有一个工作区配置的目录。
- package.json
- index.js
` --包裹
构成动植物的古名或拉丁化的现代名
`-package.json和名为my-project的顶级根包有packages/a子包。此时,如果我们安装npm,那么安装在根包中的node_modules中的NPM包/a指向本地包/a .
-节点模块
` -包/a -./包/a
- package-lock.json
- package.json
` --包裹
构成动植物的古名或拉丁化的现代名
`-package.json以上
-包/a-./packages/a/a是指从node_modules中的链接到本地npm程序包的软链。
三、package.json环境相关属性
常见的环境基本分为两类:浏览器和节点环境。接下来我们来看看package.json中与环境相关的配置属性,环境的定义可以简单理解为:
浏览器环境:比如有一些只存在于浏览器中的全局变量,比如窗口、文档等节点环境。npm包的源文件包含一些只存在于节点环境中的变量、内置包和内置函数。3.1 type
js的模块化规范包括commonjs、CMD、UMD、AMD和es模块等。最早,node中只支持commonjs字段。但是从node13.2.0开始,node已经正式支持ES模块规范。在package.json中,npm包后面的模块化规范可以通过type字段声明。
//package.json
{
名称:“某包”,
类型:“模块”“公共”
}需要注意的是:
如果未指定type,则type的默认值为commonjs,但建议npm软件包指定type。
当type字段的指定值为Module时,采用ESModule规范。
如果指定了type字段,则。目录中的js后缀遵循由类型指定的模块化规范。
除了类型可以指定模块规范,文件后面的模块规范是由文件的后缀指定的。文件以结尾。mjs是所用的ESModule规范,文件以。cjs遵循commonjs规范。
3.2 main module browser
除了type,package.json中还有三个字段:main、module和browser来定义npm包的入口文件。
Main:定义npm包的入口文件,可以在浏览器环境和节点环境下使用。模块:定义npm包ESM规范的入口文件,浏览器:定义浏览器环境下npm包的入口文件。我们来看看这三个字段的使用场景,以及这三个字段同时存在时的优先级。让我们假设有一个名为demo1的npm包,
-区
-索引.浏览器. js
-索引.浏览器. mjs
- index.js
- index.mjs在其package.json中指定了main、module、browser三个字段,
main: dist/index.js ,//main
模块: dist/index.mjs ,//模块
//browser可以定义为与main/module字段一一对应的映射对象,也可以直接定义为字符串。
浏览器:{。/dist/index.js :。/dist/index.browser.js ,//浏览器cjs。/dist/index.mjs :。/dist/index . browser . mjs /browser mjs
},
//浏览器:。默认情况下会构建并使用/dist/index . Browser . js //Browser。例如,我们在项目中引用这个npm包:
从 demo 导入demo通过构建工具构建完上述代码后,模块的加载顺序为:
browser+mjs module browser+cjs main
这个加载顺序是大多数构建工具的默认加载顺序,比如webapck、esbuild等等。这个加载顺序可以通过相应的配置进行修改,但是在大多数情况下,我们仍然会遵循默认的加载顺序。
3.3 exports
如果在package.json中定义了exports字段,那么这个字段定义的内容就是npm包真实完整的导出,优先级会高于main、file等字段。
例如:
{
名称:包装,
导出:{
.: ./main.mjs 。/foo :。/foo.js
}
}从“pkg”导入{ something };//from pkg/main . mjs const { something }=require( pkg/foo );//require(pkg/foo.js )从上面的例子来看,exports可以定义不同路径的导出。如果有导出,之前有效的文件目录会在任何地方失效,比如require(pkg/package.json ),因为在导出中没有指定,会报错。
导出的另一个最大的特点是条件引用。例如,我们可以指定npm包根据不同的引用方法或模块化类型引用不同的导入文件。
//package.json
{
名称:包装,
主“:”。/main-require.cjs ,
导出:{
导入“:”。/main-module.js ,
需要“:”。/main-require.cjs
},
类型“:”模块
}在上面的例子中,如果我们通过
Const p=require(pkg )指的是。/main-require.cjs。
如果通过:
pkg 中的p指的是。/main-module.js
最后要注意的是:如果存在exports属性,exports属性不仅优先级高于main,同时也高于module和browser字段。
三、package.json依赖相关属性
package.json与依赖关系相关的配置属性包括dependencies、devDependencies、peerDependencies和peerDependenciesMeta等。
依赖是项目的依赖,devDependencies是开发需要的模块,所以我们可以在开发过程中按需安装,提高我们的开发效率。这里需要注意的是,标准使用在你自己的项目中,如webpack、babel等。是开发依赖,不是项目本身的依赖,所以不要放在依赖里。
除了依赖项和devDependencies之外,本文还重点讨论了peerDependencies和peerDependenciesMeta。
3.1 peerDependencies
PeerDependencies是package.json中的一个依赖项,可以解决核心库多次下载,核心库版本统一的问题。
//包/包
-节点模块
-NPM-依赖反应,反应-王国
-NPM-b-依赖反应,反应-dom
- index.js例如,在上面的例子中,如果子npm包A和B都来自react和react-dom,那么如果我们在子npm包A和B的package.json中声明了PeerDependicies,那么对应的依赖项就不会被重新安装。
有两点需要注意:
对于npm7中的子npm程序包A,如果单独安装子npm a,将安装其对等设备中的程序包。但不是在npm7之前。请规范详细地说明对等设备的配置。作者看到一些react组件库没有在对等依赖中指定react和react-dom,或者将react和react-dom放在依赖中。这两种非标准规范都会有一些问题。第二,正确指定PeerDependencies中npm包的版本,react-focus-lock @ 2.8.1。PeerDependencies指定: react : 16 . 8 . 0 18 . 0 . 0 ,但实际上,
当你看到“元”的时候,它的意思是元数据。在这里,peerDependenciesMeta用对等依赖关系进行了详细的修饰。比如react-redux的npm包中package.json有这样一段话:
“对等依赖”:{
反应:^16.8.3 ^17 ^18
},
peerDependenciesMeta :
react-dom: {
可选:真
},
react-native :
可选:真
}
} react-dom 在这里指定, react-native 在peerDependenciesMeta中,是可选的,所以如果 react-dom 和 react-native 没有安装在项目中,也不会报错。
值得注意的是,我们确实通过peerDependenciesMeta取消了限制,但这里经常会出现A或B的情况。比如上面的例子,我们需要的是需要安装的“react-dom”和‘react-native’,但实际上我们并不能通过上面的语句实现这个提示。
四、package.json三方属性
package.json还有很多三方属性,比如tsc用的types,sideEffects,构建工具用的git,Git用的husky,eSlint用的eslintignore。这些扩展的配置对于特定的开发工具是有意义的,这里不举例。
更多关于node的信息,请访问:nodejs教程!以上是nodejs项目中package.json常用属性的详细说明。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。