中高级前端必须掌握的package.json最新最全指南

前言

package.json 是一个用于描述和配置项目的重要文件,其中包含了许多字段和选项,可以影响项目的构建、依赖管理、脚本执行等方面。了解这些字段可以帮助开发者更好地理解和控制项目的行为。

package.json对于大部分前端开发者来说,知道dependencies与devDependencies就够了。但对于库开发者或有更高级需求的开发者来说,了解 package.json 的其他字段是非常有必要的。

本文介绍的字段分为官方字段与非官方字段。非官方字段是被主流打包工具(webpack,Rollup)所支持, 旨在提供更高级的配置和功能,以满足特定的构建需求,可能不具备通用性。

目前版本:v7.24.2

一、必须属性

1. name

定义项目的名称,不能以"."和"_"开头,不能包含大写字母

2. version

定义项目的版本号,格式为:大版本号.次版本号.修订号

二、描述信息

1. description

项目描述

2. keywords

项目关键词

3. author

项目作者

 

js

复制代码

"author": "name (http://barnyrubble.tumblr.com/)"

4. contributors

项目贡献者

 

js

复制代码

"contributors": [ "name <b@rubble.com> (http://barnyrubble.tumblr.com/)" ]

5. homepage

项目主页地址

6. repository

项目代码仓库地址

7. bugs

项目提交问题的地址

 

js

复制代码

//提交问题的地址和反馈的邮箱,url通常是Github中的issues页面 "bugs": { "url" : "https://github.com/facebook/react/issues", "email" : "xxxxx@xx.com" }

8. funding

指定项目的资金支持方式和链接

 

js

复制代码

"funding": { "type": "patreon", "url": "https://www.patreon.com/my-module" }

三、依赖配置

1. dependencies

生产环境的依赖包

如果不使用脱字符(^),安装的版本号固定;如果使用,则能安装当前大版本的最新版本,在package-lock.json中可查看当前实际安装的版本。

2. devDependencies

开发环境的依赖包,例如webpack、vite、babel、ESLint等。

3. peerDependencies

对等依赖的作用:

  1. 减小打包体积:例如使用react开发的组件库,安装react是必不可少的,而使用组件库的开发者,本地项目肯定安装了react,因此开发的组件库中不必把react打包进去(期望项目的使用者来提供这些模块的实现)。

  2. 版本一致性:使用你的组件库的开发者需要确保他们项目中安装了与你声明的对等依赖版本兼容的包,以确保组件库正常运行。

示例:声明要使用组件库,需在项目中安装大于17.0.1版本的react

 

js

复制代码

"peerDependencies": { "react": ">17.0.1" }

4. peerDependenciesMeta

将对等依赖标记为可选,如果用户没有安装对等依赖,npm不会发出警告

 

js

复制代码

"peerDependenciesMeta": { "react": { "optional": true //标记为可选 } }

5. bundledDependencies

声明捆绑依赖项(使用情景较少)

6. optionalDependencies

声明可选依赖项(使用情景较少)

7. engines

声明对npm或node的版本要求

 

js

复制代码

"engines": { "node": ">=8.10.3 <12.13.0", "npm": ">=6.9.0" }

engines只是起一个说明的作用,即使用户安装的版本不符合要求,也不影响依赖包的安装。

8. workspaces

单个代码库中统一管理多个包(monorepo),在workspaces声明目录下的package会软链到根目录的node_modules中。

1. 初始化项目

 

js

复制代码

npm init -y

2. 声明本项目是workspaces模式

 

js

复制代码

"private":"true", "workspaces": [ "packages/*" ],

表示所有子包都在packages文件夹下

3. 创建子包p1

 

js

复制代码

npm init -w packages/p1 -y

在node_modules/.package-lock.json中可以看到 "link": true 链接符号信息

4. 新建packages/p1/index.js

 

js

复制代码

module.exports = "p1包";

5. 创建子包p2

 

js

复制代码

npm init -w packages/p2 -y

6. 将子包p1添加到p2中

 

js

复制代码

npm i p1 -w p2

安装,卸载等命令都是一样的,只是多了"--workspace="参数(简写-w),用来指定在哪个包中执行命令

7. 子包p2使用p1

 

js

复制代码

const p1 = require("p1"); console.log("使用", p1); module.exports = "p2包";

workspaces功能与lerna类似,如果只需简单地管理多个包,workspaces足够了。lerna具有版本管理,发包提示,简化多包项目发布流程等更多功能。

四、脚本配置

1. scripts

脚本入口

2. config

用于定义项目的配置项,例如设置环境变量

1. config 配置

 

js

复制代码

"config": { "baseUrl": "https://example.com" }

2. scripts 配置

 

js

复制代码

"scripts": { "start": "node index.js", },

3. 新建index.js

 

js

复制代码

//使用process.env.npm_package_config_XXX取值 console.log(process.env.npm_package_config_baseUrl)

运行 npm run start,终端打印出 example.com

五、文件&目录

1. module(非官方字段)

指定 ES 模块入口文件

示例:当其他开发者在他们的项目中导入你的包时,会加载并执行包中的dist/index.esm.js

 

js

复制代码

"main": "dist/index.esm.js"

2. main

指定 CommonJS 模块或 ES 模块入口文件。如果不指定该字段,默认是根目录下的index.js

提示:从 Node.js 12.20.0 版本开始,"main" 字段也可以指定 ES 模块的入口文件

3. browser

指定浏览器使用的入口文件,例如umd模块。

4. types(非官方字段)

指定 TypeScript 类型声明文件(.d.ts 文件)的路径

5. exports(非官方字段)

当打包工具支持exports字段时(webpack、Rollup 等),以上main,browser,module,types四个字段都被忽略

"." 表示默认导出

"import": 指定了 ES module (ESM) 规范下的导出文件路径

"require": 指定了 CommonJS 规范下的导出文件路径

"browser": 指定了用于浏览器环境的导出文件路径

"types": 指定了类型声明文件的路径

 

js

复制代码

"exports": { ".": { "import": "./dist/index.esm.js", "require": "./dist/index.cjs.js", "browser": "./dist/index.umd.js", "types": "./dist/index.d.ts" } }

导出其他文件,例如除了导出默认路径,导出源文件

 

js

复制代码

"exports":{ ... "./main" : "./src/main.js" },

其他项目中使用

 

js

复制代码

import main from 'packageName'; // . 方式定义的 import main from 'packageName/main'; // ./main 方式定义的

6. type(非官方字段)

指定模块系统的使用方式,"commonjs","module","umd","json"

示例:指定模块系统为ES module模式,使用CommonJS文件时,需显式的定义为 .cjs 文件扩展名,来明确指定这些文件为 CommonJS 模块

 

js

复制代码

"type":"module"

7. files

指定哪些包被推送到npm服务器中

示例:只推送index.js和dist包到npm服务器

 

js

复制代码

"files": [ "index.js", "dist" ],

可以在项目根目录新建一个.npmignore文件,说明不需要提交到npm服务器的文件,类似.gitignore。写在这个文件中的文件即便被写在files属性里也会被排除在外

8. bin

定义在全局安装时可执行的命令(使用情景较少)

9. man

Linux 中的帮助指令(使用情景较少)

10. directories

定义项目目录结构的字段(使用情景较少)

六、发布配置

1. private

防止私有包发布到npm服务器,要发布到npm上设为false

2. preferGlobal(非官方字段)

当设置 "preferGlobal" 字段为 true 时,它表示你的包更适合以全局方式安装,而不是作为项目的依赖项进行本地安装。

这个字段的设置是为了向用户传达关于你的包的最佳使用方式的建议。它并不会直接影响包的安装方式或包管理器的行为。

3. publishConfig

在发布包时指定特定的配置

示例:指定包发布的注册表 URL,指定所有用户都可以访问(私有的会收费)

 

js

复制代码

"publishConfig": { "registry": "https://registry.npmjs.org/", "access": "public" }

4. os

指定你的包适用的操作系统

示例:包只适用于darwin(macOS)和 linux

 

js

复制代码

"os": ["darwin", "linux"]

示例:禁用win32

 

js

复制代码

"os" ["!win32"] //禁用的操作系统

5. cpu

该配置和OS配置类似,用CPU可以更准确的限制用户的安装环境

6. license

指定软件的开源协议:

ISC:在所有副本中保留版权声明和许可证声明,使用者就可以拿你的代码做任何想做的事情,你也无需承担任何责任

MIT:在所有副本或主要部分中保留版权声明和许可证声明,使用者就可以拿你的代码做任何想做的事情,你也无需承担任何责任

开源协议查询地址:opensource.org/licenses/

七、第三方配置(非官方字段)

1. eslintConfig

eslint的配置,更推荐新建 .eslintrc 进行配置

使用参考:新建 .eslintrc

2. babel

babel的配置,更推荐新建 .babelrc 进行配置

3. unpkg

unpkg 是一个基于 CDN 的前端包托管服务,用于在浏览器中直接引用和加载 npm 上发布的包。

无需下载,直接通过 <script> 标签引用

 

js

复制代码

<script src="https://unpkg.com/package-name@version"></script>

4. lint-staged

lint-staged是一个在Git暂存文件上运行linters的工具,通常配合gitHooks一起使用。

使用参考:配置 husky、lint-staged、@commitlint/cli

5. browserslist

告知支持哪些浏览器及版本,Autoprefixer常用到它

 

js

复制代码

"browserslist": [ "defaults", "not ie < 8", "last 2 versions", "> 1%", "iOS 7", "last 3 iOS versions" ]

6. sideEffects

指示包是否具有副作用,协助Webpack,Rollup等进行tree shaking

多数情况下可以直接设置为false,这样打包工具就会自动删除未被import的代码

但是有些情况例外

  1. 有一些特定的模块文件,它们执行一些副作用操作,如注册全局事件监听器、修改全局状态等。

  2. 告诉构建工具不要将样式文件排除在无用代码消除的优化范围之外

 

js

复制代码

"sideEffects": ["./path/to/module.js", "*.css"]

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

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

相关文章

spring boot maven 手动打入外部jar包依赖

有时候拿到第三方sdk是&#xff0c;以前都放在项目的某个目录下&#xff0c;然后通过项目路径去引入非常麻烦&#xff0c;最近找到了一个方法&#xff0c;可以手动将外部的jar包导入到本地的maven仓库中&#xff0c;这样你就可以像其他依赖一样正常使用了。 命令如下 mvn inst…

Spring6.0 源码部署

环境依赖 Git JDK17 Gradle&#xff08;版本号需要和Spring源码中的版本一致&#xff09; 源码下载 官网地址 源码配置修改 maven { url "https://maven.aliyun.com/repository/central" }gradle-wrapper.properties #distributionUrlhttps\://services.gradle…

无虚拟 DOM 版 Vue 进行到哪一步了?

前言 就在一年前的 Vue Conf 2022&#xff0c;尤雨溪向大家分享了一个非常令人期待的新模式&#xff1a;无虚拟 DOM 模式&#xff01; 我看了回放之后非常兴奋&#xff0c;感觉这是个非常牛逼的新 feature&#xff0c;鉴于可能会有部分人还不知道或者还没听过什么是 Vue 无虚…

离线安装Elasticsearch7.15.1集群(使用内置jdk)

离线安装Elasticsearch7.15.1集群(使用内置jdk) 背景&#xff1a; 以192.168.50.210、192.168.50.211、192.168.50.212这三台机器为例&#xff0c;进行相关的配置 而我本地的jdk是1.8的&#xff0c;已经不符合要求了。但项目中没有那么高版本的jdk&#xff0c;也只想用1.8版本…

Excel-公式VLOOKUP 使用方法-小记

个人愚见 表示 MongoDB列中的任意一条数据 在 MySQL列 精确查找 和MongoDB列 中一模一样的数据&#xff0c;有的话返回MongoDB列数据&#xff0c;没有话返回#N/A 官方解释

【Web安全】小白怎么快速挖到第一个漏洞,src漏洞挖掘经验分享,绝对干货!

src漏洞挖掘经验分享 – 掌控安全以恒 一、公益src 公益src是一个白帽子提交随机发现的漏洞的品台&#xff0c;我们可以把我们随机发现或者是主动寻找到的漏洞在漏洞盒子进行提交。 在挖掘src的时候不能越红线&#xff0c;一般情况下遇到SQL注入 只获取数据库名字以证明漏洞的…

myAgv的slam算法学习以及动态避障下篇

引言 在之前的一篇文章中有提到购入了一台myAGV&#xff0c;以树莓派4B为控制核心的移动机器人。上篇文章中向大家介绍了myAGV如何实现建图、导航以及静态避障&#xff0c;但我们深知&#xff0c;这只是机器人自主导航能力的基础。在实际应用场景中&#xff0c;机器人需要面对复…

Flask入门:flask run运行入口函数

背景&#xff1a; 这两天在看后端代码覆盖率平台代码的时候&#xff0c;发现启动服务只需要执行flask run命令即可。但是找了半天都没有看到工程中Flask app实例对象是在哪里创建的。工程中定义了一个create_app()函数&#xff0c;可是没有看到调用它的地方。带着疑惑&#xf…

2023牛客暑期多校训练营1

2023牛客暑期多校训练营1 D-Chocolate 题意 ​ 二人博弈&#xff0c;每局给出一个 n m nm nm的巧克力&#xff0c;每次操作可以选择一个点 ( x , y ) (x,y) (x,y)然后拿走所有 ( i ≤ x & & j ≤ y ) (i \leq x \&\&j\leq y) (i≤x&&j≤y)的巧克力…

创建 CephFS 文件系统 MDS 接口(短暂的分别是为了更好的再见)

文章目录 一、Ceph 简介二、Ceph 特点三、创建 CephFS 文件系统 MDS 接口四、 创建 Ceph 块存储系统 RBD 接口五、 创建 Ceph 对象存储系统 RGW 接口1、对象存储概念2、创建 RGW 接口3、将生成的证书合并为pem OSD 故障模拟与恢复1、模拟 OSD 故障2、将坏掉的 osd 踢出集群 一、…

【react】react18的学习(十一)– 底层原理(一)之 diff 算法

diff算法、fiber链表 步骤&#xff1a;&#xff08;追求多复用&#xff0c;快渲染&#xff09; 首次渲染&#xff0c;缓存虚拟dom或fiber链表&#xff08;17及以后&#xff09;&#xff1b; 组件更新&#xff0c;将新生成的虚拟dom与已有的真实dom的fiber链表对比&#xff1b…

【C语言+sqlite3 API接口】实现水果超市

实验内容&#xff1a; 假如我家开了个水果超市&#xff0c;有以下水果&#xff0c;想实现自动化管理&#xff0c;扫描二维码就能知道当前的水果状态&#xff0c;进货几天了&#xff0c; 好久需要再次进货&#xff0c;那些水果畅销&#xff0c;那些水果不畅销&#xff0c;那些水…

selenium查找svg元素

目录 如何为SVG元素编写XPath 使用local-name&#xff08;&#xff09;的语法 需要记住的一点 将“and”与SVG元素一起使用 如何定位嵌套的SVG元素&#xff1f; XPath是一种用于定位XML文档中的web元素的语言&#xff0c;包括构成网页的HTML文档。在Selenium中&#xff0…

学习day48

事件的基本使用&#xff1a; 1.使用v-on&#xff1a;xxx或xxx绑定事件&#xff0c;其中xxx是事件名 2.事件的回调需要配置在methods对象中&#xff0c;最终会在vm上 3.methods中配置的函数&#xff0c;不要用箭头函数&#xff01;否则this就不是vm了 4.methods中配置的函数&…

【计算机视觉】DINOv2(视觉大模型)代码四个不同模型的对比,以 28 * 28 的图像为例(完整的源代码)

文章目录 一、ViT-S/14二、ViT-B/14三、ViT-L/14四、ViT-g/14 一、ViT-S/14 import torch import torchvision.transforms as T import matplotlib.pyplot as plt import numpy as np import matplotlib.image as mpimg from PIL import Image from sklearn.decomposition im…

golang之json注释处理

场景 json 作为现代比较常用的文本格式,本身是不支持注释的,因为它的设计初衷是作为一种轻量级数据交换格式,只需要包含数据本身,而不应该包含注释或者其他无关的信息。 但是有时json内字段较多,想写一些注释说明,这些都是编程工具或者编辑器特有的功能,常见的注释如下…

ES系列--es进阶

一、系统架构 一个运行中的 Elasticsearch 实例称为一个节点&#xff0c;而集群是由一个或者多个拥有相同 cluster.name 配置的节点组成&#xff0c; 它们共同承担数据和负载的压力。当有节点加入集群中或者 从集群中移除节点时&#xff0c;集群将会重新平均分布所有的数据。 …

准备WebUI自动化测试面试?这30个问题你必须掌握(一)

本文共有8600字&#xff0c;包含了前十五个问题&#xff0c;如需要后十五个问题&#xff0c;可查看文末链接~ 1. 什么是WebUI自动化测试&#xff1f; WebUI自动化测试是指使用自动化测试工具和技术来模拟用户在Web用户界面&#xff08;UI&#xff09;上执行操作&#xff0c;并…

动态内存管理(C语言)

动态内存管理 1. 为什么存在动态内存管理2. 动态内存函数的介绍2.1 malloc函数和free函数2.2 calloc函数2.3 realloc函数 3. 常见的动态内存错误3.1 对NULL指针的解引用操作3.2 对动态开辟空间的越界访问3.3 对非动态开辟内存使用free函数3.4 使用free释放动态开辟内存的一部分…

C#窗口程序添加最大最小化

要在C#开发的窗口程序中添加最大化和最小化按钮&#xff0c;可以按照以下步骤进行操作&#xff1a; 打开窗口的设计视图&#xff0c;在窗口的标题栏上找到一个名为"ControlBox"的属性&#xff0c;将其设置为"True"。这将显示窗口的控制按钮&#xff0c;包…