【制作npm包2】了解 package.json 相关配置

news2024/11/15 7:03:21

制作npm包目录

本文是系列文章, 作者一个橙子pro,本系列文章大纲如下。转载或者商业修改必须注明文章出处

一、申请npm账号、个人包和组织包区别
二、了解 package.json 相关配置
三、 了解 tsconfig.json 相关配置
四、 api-extractor 学习
五、npm包制作完整教程,我的第一个npm包


学习 package.json

各大项目的根目录都可以看到package.json这个文件,这个文件到底有什么作用了。对于这个文件的配置项很多,其中最常配置的nameversion,在平时开发种,大多数配置项可能非常没用。但是对于制作一个安装包而言,太重要了,这里必须解释一番。

这个json 大致是我的npm项目当中用到的配置,其它的

{
  "name": "@v3p/npm-pkg-by-vite",
  "version": "1.0.5-0",
  "description": "基于vite的npm包模板",
  "type": "module",
  "files": [
    "dist"
  ],
  "main": "./dist/index.cjs",
  "module": "./dist/index.mjs",
  "types": "./dist/index.d.ts",
  "exports": {
    ".": {
      "import": "./dist/index.mjs",
      "require": "./dist/index.cjs",
      "types": "./dist/index.d.ts"
    }
  },
  "scripts": {
    "dev:demo": "cd example && vite",
    "build:demo": "cd example && vite build",
    "build": "vite build",
    "build-types": "vue-tsc -p ./tsconfig.types.json && api-extractor run -c api-extractor.json && node scripts/cleanup.js",
    "build-all": "npm run build && npm run build-types"
  },
  "keywords": [
    "一个橙子pro",
    "vue",
    "vite",
    "typescript"
  ],
  "repository": {
    "type": "git",
    "url": "git+https://github.com/vue3plugin/npm-pkg-by-rollup.git"
  },
  "author": "biancangming",
  "license": "MIT",
  "bugs": {
    "url": "https://github.com/vue3plugin/npm-pkg-by-rollup/issues"
  },
  "homepage": "https://github.com/vue3plugin/npm-pkg-by-rollup#readme",
  "devDependencies": {
    "@microsoft/api-extractor": "^7.36.4",
    "@types/node": "^20.4.8",
    "@vitejs/plugin-vue": "^4.2.3",
    "tslib": "^2.6.1",
    "typescript": "^5.1.6",
    "vite": "^4.4.9",
    "vue": "^3.3.4",
    "vue-tsc": "^1.8.8"
  },
  "dependencies": {
    "@tsconfig/node18": "^18.2.0",
    "@vue/tsconfig": "^0.4.0"
  }
}

name

仓库的名字,这个名字可能在开发项目的时候没放在心上。对于npm包而言,当我们发布一个插件之后,使用npm install xx命令时,npm网站就会查找这个名字,下载到本地的node_modules文件夹里面。

@开头的就是组织的命名方式了。

一般在项目使用第三方包的时候,无论是require还是import实际上是调用的这里的名字。这点,在制作包的章节会重点介绍。

version

当我们在项目根目录执行npm version xxx命令时,这个版本号会随之变动。这块建议反复练习,自行观察。

version 的格式是major.minor.patch-prerelease, 并且需要遵循该规则。这个字段是一个包当中十分必要的字段,该字段由四位组成,分别是主要版本号、次要版本号、补丁版本号、最后存在短杠连接的表示预览版本,且存在一个预览的版本号

版本号的主要操作命令是,npm version,我们可以直接执行类似,npm version 1.0.0的命令修改当前的版本号,如果只是这样的话,还不如在 package.json文件当中手动修改。

在官方的解释当中,它的命令是这样的。

npm version [<newversion> | major | minor | patch | premajor | preminor | prepatch | prerelease | from-git]

下面是对该命令用法上的一些举例

npm version major 执行该命令修改主要版本号+1,同时清除预览版本号(如果存在)
npm version minor执行该命令修改次要版本号+1,同时清除预览版本号(如果存在)
npm version patch 执行该命令修改补丁版本号+1,同时清除预览版本号(如果存在)
npm version premajor 执行该命令修改主要版本号+1,同时添加预览版本号(如果不存在)
npm version preminor 执行该命令修改次要版本号+1,同时添加预览版本号(如果不存在)
npm version prepatch 执行该命令修改补丁版本号+1,同时添加预览版本号(如果不存在)
npm version prerelease 执行该命令预览版本号+1
npm version from-git 执行该命令拉取git版本号,同步为npm版本

在使用一个安装包的时候,通常会看到安装包的每个版本前有类似^~这种符号。

 "vue": "^3.3.4" // 

一旦有了符号的存在,则表示我们在执行npm install的时候,安装的并非看到的版本。

^ 表示锁定主版本,后边的版本是不会锁定的,在执行npm i的时候,也可能安装的是3.4.x的版本。
~ 表示锁住主版本和次要版本,只更新补丁版本

之前就有vue从2.6 升级2.7直接支持了composition-api的语法,导致我司大量项目翻车,只好逐个把项目当中^改为~。如果项目长时间搁置的话,建议将package-lock.json文件甚至node_modules一直做保留,血泪教训😥

type

用于指定 npm 包的类型,这个字段比较特殊,它影响的是开发阶段。目前对于新版的node来说有两种导包方式,目前可取值 commonjsmodule。设置为module,在根目录的配置文件就可以直接使用import方式导入包,而不需要module.exports的形式

files

在发布包的时候特别有用,用于控制推送到npm仓库包不包含多余的文件。

files 的值是一个数组,值是文件名或者文件夹名,如果是文件夹名,则文件夹下所有的文件也会被包含进来(除非文件被另一些配置排除了)

根目录下创建一个.npmignore文件,这个文件当中可以写入文件名或者文件夹名,用于排除某些文件。

文件示例如下

.vscode
demo/
etc/

main

main 字段指定了模块的入口文件,它的值是一个相对于项目根目录的路径。一般提供给commonjs模块系统使用,在项目当中使用require导入则使用这个字段

module

这个字段指定了用于 ES6 模块的入口文件。如果你的模块使用了 ES6 模块语法,并且想要在支持该语法的环境中使用该模块,就需要指定 module 字段。
一般提供给es模块系统使用,在项目当中使用import .. from ..导入则使用这个字段

types

这个字段指定了 typeScript 类型定义文件的入口,用于ts项目当中类型推断使用

exports

package.json 中,exports 字段是一个对象。表示可以定义多种类型的导入形式。例如:

{
  "exports": {
    ".": "./index.js",
    "./utils": "./lib/utils.js"
  }
}

这种方式的导入默认是es的导出方式,下面还有一种写法

"exports": {
    ".": {
      "import": "./dist/mjs/index.mjs",
      "require": "./dist/cjs/index.cjs",
      "types": "./dist/npm-pkg-by-rollup.d.ts"
    }
  },

这种方式则支持多种方式导出,对我们来说更加通用。后边在介绍npm制作时,对这里会进行一些拓展。

exports 可以替代上边几种类型,但是我们一般这四个字段都需要定义。毕竟旧版的node并不是全部能够支持这些字段,例如node12版本,可能还不识别exports。如果了解前端的模块化历史,就知道前端的模块化统一有多艰难,不过目前来说,一直向es模块化归一了。

author

指明项目的作者,网站上在keywords 下方显示

keywords

这个关键词是一个字符串数组,描述安装包的关键词。关键字在搜索包的时候,随着搜索结果出现在列表下方。
在这里插入图片描述

description

一个描述当前项目的简短说明,描述同样显示在搜索结果当中。这个和keywords关键字一样重要,要不然别人在搜索包的时候没有任何描述,难免有些苍白。
在这里插入图片描述

scripts

可运行于命令行的脚本命令的对象,它们用来执行项目中特定的任务。

repository

指向项目代码的 Git 存储库的 URL 的对象。

homepage

当前项目的主页 URL,和上方的repository在网站显示在如图位置。
在这里插入图片描述

license

一个字符串,指明当前项目的开源许可证。

bugs

指定对项目有疑问时,去哪里进行提问。

dependencies

一个包含当前项目的生产环境所需的所有第三方包和模块的对象。

devDependencies

当前项目里面的开发依赖包,开发依赖包和上边的dependencies,很多人难以区分作用。的确,在日常开发的时候作用不是很明显,但是当制作安装包时就体现出作用了。当我们的依赖包被别人安装时, devDependencies里面的东西是不会被安装的。
通常使用npm i xx -D安装此类依赖包

peerDependencies

用于指导npm安装正确的依赖版本。

例如:某项目依赖vue 3.2.1这个版本,当我们安装当前包时,会根据peerDependencies的配置,寻找响应依赖版本是否已经被安装,如果依赖包没有被安装,或者安装版和已经安装的版本存在冲突,则会终止安装过程。

可以使用–legacy-peer-deps参数,绕过这种机制。

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

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

相关文章

TECHnalysis Research:关于生成式AI的几个意外发现

TECHnalysis Research是一家美国的独立市场调查公司&#xff0c;该调查公司于2023年5月份对于全美10个行业的1000家企业IT决策负责人进行了调研&#xff0c;调研围绕生成式AI及其对于企业业务的影响。就在全球持续升温的生成式AI热度中&#xff0c;TECHnalysis Research的调研结…

第二章 搜索 No.2多源bfs,最小步数与双端队列广搜

文章目录 多源bfs&#xff1a;173. 矩阵距离最小步数&#xff1a;1107. 魔板双端队列bfs&#xff1a;175. 电路维修 根据Dijkstra的正确性可以验证bfs的正确性 多源bfs&#xff1a;173. 矩阵距离 173. 矩阵距离 - AcWing题库 输出01矩阵中的所有点到1的最短曼哈顿距离&#…

构建智能医疗未来:人工智能在线上问诊系统开发中的应用

随着人工智能技术的飞速发展&#xff0c;医疗领域也正在逐步迎来一场革命性的变革。其中&#xff0c;人工智能在在线上问诊系统开发中的应用&#xff0c;正为医疗产业带来全新的可能性。本文将深入探讨如何利用代码构建智能医疗未来&#xff0c;以提升线上问诊系统的效率、准确…

CSAPP Lab2:Bomb Lab

说明 6关卡&#xff0c;每个关卡需要输入一个字符串&#xff0c;通过逆向工程来获取对应关卡的字符串 准备工作 环境 需要用到gdb调试器 apt-get install gdb系统: Ubuntu 22.04 本实验会用到的gdb调试器的指令如下 r或者 run或者run filename 运行程序,run filename就是…

8----代码块

一、行内代码​ 使用一对反引号()来创建行内代码。 如果在行内代码中需要包含反引号本身&#xff0c;可以使用两个反引号对加前后空格来创建。(但是这样的代码块不会进行语法高亮&#xff0c;只是简单地将代码以等宽字体显示) 注&#xff1a;反引号在键盘上位于左上角&#xff…

用Python打造复古风格的游戏:回归8位时代【俄罗斯方块】

大家好&#xff0c;我是辣条&#xff01; 今天带大家来写一个说难不难&#xff0c;说简单也不算接单的复古小游戏&#xff1a;俄罗斯方块游戏&#xff01; 目录 前言&#xff1a;步骤首先接下来然后接下来最后 上代码&#xff1a;总结: 前言&#xff1a; 俄罗斯方块是一款经典…

PyTorch深度学习实战——使用卷积神经网络执行图像分类

PyTorch深度学习实战——使用卷积神经网络执行图像分类 0. 前言1. Fashion-MNIST 数据集图像分类2. 模型测试相关链接 0. 前言 我们已经在《卷积神经网络详解》一节中介绍了传统神经网络在面对图像平移时的问题以及卷积神经网络 (Convolutional Neural Network, CNN) 的工作原…

CSS 字体修饰属性

前言 字体修饰属性 属性说明font-family指定文本显示字体font-size设置字体的大小font-weight设置字体的粗细程度font-style设置字体的倾斜样式text-decoration给文本添加装饰线text-indent设置文本的缩进text-align设置文本的对齐方式line-height设置行高color设置文本的颜色…

IDEA常用插件推荐(个人)

分享下个人在大厂工作四五年的一个常用配置插件 一、Alibaba Java Coding Guidelines 代码规范插件(必备) 阿里巴巴代码规范检查 人手必备。减少你的垃圾代码 各种不良提示代码全靠它了。 代码划线的嘎嘎 crtlenter优化得了 二、Atom Material File Icons 图标主题插件(提示…

Java学习手册——第二篇面向对象程序设计

Java学习手册——第二篇面向对象 1. 结构化程序设计2. 面向对象 第一章我们已经介绍了Java语言的基础知识&#xff0c;也知道他能干什么了&#xff0c; 那我们就从他的设计思想开始入手吧。 接触一个语言之前首先要知道他的大方向&#xff0c;设计思想是什么样的&#xff0c; 这…

【高阶数据结构】红黑树详解

文章目录 前言1. 红黑树的概念及性质1.1 红黑树的概念1.2 红黑树的性质1.3 已经学了AVL树&#xff0c;为啥还要学红黑树 2. 红黑树结构的定义3. 插入&#xff08;仅仅是插入过程&#xff09;4. 插入结点之后根据情况进行相应调整4.1 cur为红&#xff0c;p为红&#xff0c;g为黑…

Redis——哨兵模式(docker部署redis哨兵)+缓存穿透和雪崩

哨兵模式 自动选取主机的模式。 概述 主从切换技术的方法是:当主服务器宕机后&#xff0c;需要手动把一台从服务器切换为主服务器&#xff0c;这就需要人工干预&#xff0c;费事费力&#xff0c;还会造成段时间内服务不可用。这不是一种推荐的方式&#xff0c;更多时候&…

LabVIEW调用DLL传递结构体参数

LabVIEW 中调用动态库接口时&#xff0c;如果是值传递的结构体&#xff0c;可以根据字段拆解为多个参数&#xff1b;如果参数为结构体指针&#xff0c;可用簇&#xff08;Cluster&#xff09;来匹配&#xff0c;其内存连续相当于单字节对齐。 1.值传递 接口定义&#xff1a; …

交叉导轨的内部结构

相对于直线导轨&#xff0c;交叉导轨的知名度是没那么高的&#xff0c;但随着技术水平的提高&#xff0c;精度更高&#xff0c;安装高度更低的交叉导轨也慢慢走近大众的视野&#xff0c;得到更多厂商的青睐&#xff0c;使用范围也更加广泛。 交叉导轨是由两根具有V型滚道的导轨…

数据结构之动态内存管理机制

目录 数据结构之动态内存管理机制 占用块和空闲块 系统的内存管理 可利用空间表 分配存储空间的方式 空间分配与回收过程产生的问题 边界标识法管理动态内存 分配算法 回收算法 伙伴系统管理动态内存 可利用空间表中结点构成 分配算法 回收算法 总结 无用单元收…

leetcode-413. 等差数列划分(java)

等差数列划分 leetcode-413. 等差数列划分题目描述双指针 上期经典算法 leetcode-413. 等差数列划分 难度 - 中等 原题链接 - 等差数列划分 题目描述 如果一个数列 至少有三个元素 &#xff0c;并且任意两个相邻元素之差相同&#xff0c;则称该数列为等差数列。 例如&#xff0…

【Linux操作系统】Linux系统编程实现递归遍历目录,详细讲解opendir、readdir、closedir、snprintf、strcmp等函数的使用

在Linux系统编程中&#xff0c;经常需要对目录进行遍历操作&#xff0c;以获取目录中的所有文件和子目录。递归遍历目录是一种常见的方法&#xff0c;可以通过使用C语言来实现。本篇博客将详细介绍如何使用C语言实现递归遍历目录的过程&#xff0c;并提供相应的代码示例&#x…

高阶数据结构-图

高阶数据结构-图 图的表示 图由顶点和边构成&#xff0c;可分为有向图和无向图 邻接表法 图的表示方法有邻接表法和邻接矩阵法&#xff0c;以上图中的有向图为例&#xff0c;邻接表法可以表示为 A->[(B,5),(C,10)] B->[(D,100)] C->[(B,3)] D->[(E,7)] E->[…

AgentBench::AI Agent 是大模型的未来

最有想象力、最有前景的方向 “Agent 是 LLM(大语言模型)的最有前景的方向。一旦技术成熟,短则几个月,长则更久,它可能就会创造出超级个体。这解释了我们为何对开源模型和 Agent 兴奋,即便投产性不高,但是我们能想象自己有了 Agent 之后就可以没日没夜地以百倍效率做现在…

Collada .dae文件格式简明教程【3D】

当你从互联网下载 3D 模型时&#xff0c;可能会在格式列表中看到 .dae 格式。 它是什么&#xff1f; 推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景。 1、Collada DAE概述 COLLADA是COLLAborative Design Activity&#xff08;中文&#xff1a;协作设计活动&#xff09…