npm/package.json 常用配置笔记

npm(Node Package Manager)是Node.js的包管理器,它提供了一种简单的方式来安装、更新和管理Node.js的包。npm是Node.js生态系统中不可或缺的一部分,它拥有庞大的包库,几乎可以满足开发者的所有需求。本文将详细介绍npm的常用命令,帮助开发者更高效地使用npm进行项目开发。

npm init

npm init 命令用于初始化一个新的npm项目。它会引导你创建一个package.json文件,其中包含了项目的基本信息和依赖项。这个文件是项目的心脏,记录了项目的元数据和依赖关系。

bash 复制代码
mkdir myproject
cd myproject
npm init

命令使用

npm install 命令用于安装新的包。它可以安装来自npm仓库的任何包,并将它们添加到项目的依赖列表中。

bash 复制代码
npm install [<package-spec> ...]
 
别名: add, i, in, ins, inst, insta, instal, isnt, isnta, isntal, isntall
默认情况

默认情况下 npm install 将安装package.json 中列为依赖的所有模块。到本地 node_modules 文件夹。

bash 复制代码
npm install
-g --production

即,将 -g 或 --global 附加到命令中。使用 --production 标志(或者当 NODE_ENV 环境变量设置为 production 时),npm 将不会安装 devDependencies 中列出的模块

bash 复制代码
npm install -g --production

npm install

如果 位于项目的根目录中,它的依赖将被安装,并且可能会像其他类型的依赖一样被提升到顶层 node_modules。 如果 位于项目的根之外, npm 不会在目录 中安装包依赖,但它会创建指向 的符号链接。

bash 复制代码
npm install ./com

npm install

安装位于文件系统上的包。

bash 复制代码
npm install qs-6.11.2.tgz

npm install

获取 tarball url,然后安装它。

bash 复制代码
npm install https://wweee.com/demo.tgz

npm install [<@scope>/]

进行 @ 安装,其中 是 "tag" 配置。

bash 复制代码
npm install qs

其它

bash 复制代码
npm install <alias>@npm:<name>
npm install [<@scope>/]<name>@<tag>
npm install [<@scope>/]<name>@<version>
npm install [<@scope>/]<name>@<version range>
npm install <git remote url>
npm install gist:[<githubname>/]<gistID>[#<commit-ish>|#semver
npm install bitbucket:<bitbucketname>/<bitbucketrepo>[#<commit-ish>]
npm install gitlab:<gitlabname>/<gitlabrepo>[#<commit-ish>]

指定node_modules目录

bash 复制代码
npm install --prefix ./custom_path

npm install --modules-folder path/to/custom/node_modules

package.json文件

package.json 文件一般都在每个项目的根目录下面,定义了这个项目所需要的各种模块,以及项目的配置信息,包括名称、版本、许可证、依赖模块等元数据。格式是严格的JSON格式。
在 npm 包的 package.json 文件中,有两个字段可以定义包的入口点:main 和 exports。这两个字段既可以定义 ES 模块的入口点,也可以定义 CommonJS 模块的入口点。

exports 字段的基本用法

main 用于定义包的主要入口点,exports 字段功能更加强大,允许定义多个入口点,支持在不同环境之间进行条件入口解析,并且除了 exports 中定义的入口点之外,阻止其他任何入口点。

bash 复制代码
npm install file:common

common/package.json

  • 在 package.json 的 exports 字段中,你可以指定包的主要入口点和其他自定义子路径。
json 复制代码
{
  "name": "common",
  "version": "1.0.0",
  "exports": {
    ".": "./index.ts",
    "./submodule": "./submodule/index.ts"
  }
}
// . 表示包的主入口,指向 ./index.js 文件。
// ./submodule 表示包的一个子模块,指向 ./submodule/index.js 文件。

common/index.ts

js 复制代码
export function add(a:number, b:number) {
  return a + b;
}

export function subtract(a:number, b:number) {
  return a - b;
}

// import { add, subtract } from "common";

common/submodule/index.ts

js 复制代码
export function add2(a:number, b:number) {
  return a + b;
}

// import { add2 } from "common/submodule";
json 复制代码
{
  "name": "my-package",
  "version": "1.0.0",
  "exports": {
    ".": {
      "node": "./node-main.js",
      "browser": "./browser-main.js",
      "default": "./main.js"
    }
  }
}
// "import": 针对 ES 模块的导入。
// "require": 针对 CommonJS 模块的导入。
// "node": 针对 Node.js 环境。
// "browser": 针对浏览器环境。
// "default": 默认导出,当没有其他条件匹配时使用。

子路径导入

在复杂的项目中,为了引用位于不同目录层级的模块,开发者通常需要使用多个 ../ 来回溯目录层级,这不仅书写繁琐而且容易出错。通过在 package.json 文件中配置 imports 字段,开发者可以定义一组路径别名(即路径映射),使得整个应用程序可以通过这些预定义的路径来简化模块的导入,而不需要每次都写出冗长的相对路径。

  • package.json
json 复制代码
{
  "imports": {
    "#utils/calc": "./src/utils/calc.ts"
  }
}

src/utils/calc.ts

js 复制代码
export function add(a:number, b:number) {
  return a + b;
}
// import { add } from "#utils/calc";

子路径模式

如果一个 npm 包拥有大量导出或导入项,如果逐一列出这些路径,会导致 package.json 文件臃肿并引发维护问题。

json 复制代码
// ./node_modules/es-module-package/package.json
{
  "exports": {
    "./features/*.js": "./src/features/*.js"
  },
  "imports": {
    "#internal/*.js": "./src/internal/*.js"
  }
}
// 私有的子文件夹
// "./features/private-internal/*": null
js 复制代码
import featureX from 'es-module-package/features/x.js';
// Loads ./node_modules/es-module-package/src/features/x.js

import featureY from 'es-module-package/features/y/y.js';
// Loads ./node_modules/es-module-package/src/features/y/y.js

import internalZ from '#internal/z.js';
// Loads ./node_modules/es-module-package/src/internal/z.js
相关推荐
艾小码6 分钟前
手把手教你实现一个EventEmitter,彻底告别复杂事件管理!
前端·javascript·node.js
Jedi Hongbin3 小时前
Three.js shader内置矩阵注入
前端·javascript·three.js
加载中3613 小时前
pnpm时代包版本不一致问题还是否存在
前端·面试·npm
掘金安东尼3 小时前
Node.js 如何在 2025 年挤压 I/O 性能
前端·javascript·github
得物技术4 小时前
前端日志回捞系统的性能优化实践|得物技术
前端·javascript·性能优化
ZKshun4 小时前
[ 前端JavaScript的事件流机制 ] - 事件捕获、冒泡及委托原理
javascript
薛定谔的算法4 小时前
JavaScript栈的实现与应用:从基础到实战
前端·javascript·算法
魔云连洲4 小时前
React中的合成事件
前端·javascript·react.js
唐•苏凯6 小时前
ArcGIS Pro 遇到严重的应用程序错误而无法启动
开发语言·javascript·ecmascript
萌萌哒草头将军6 小时前
🚀🚀🚀 Oxc 恶意扩展警告;Rolldown 放弃 CJS 支持;Vite 发布两个漏洞补丁版本;Rslib v0.13 支持 ts-go
前端·javascript·vue.js