node package.json,nodejs package

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: