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
相关推荐
irises28 分钟前
tabby-vscode代码补全的一些阅读笔记
前端·javascript
千野竹之卫32 分钟前
2025最新云渲染网渲100渲染农场使用方法,渲染100邀请码1a12
开发语言·前端·javascript·数码相机·3d·3dsmax
__不想说话__39 分钟前
面试官问我React Router原理,我掏出了平底锅…
前端·javascript·react.js
yzzzz41 分钟前
面试官:聊聊数组扁平化
javascript·面试
头发秃头小宝贝1 小时前
JavaScript 高级之手写Promise
前端·javascript·面试
还是鼠鼠1 小时前
Node.js Express 处理静态资源
前端·javascript·vscode·node.js·json·express
开水好喝1 小时前
项目如何安装本地tgz包并配置局部registry
javascript
智能编织者1 小时前
用 Pinia 点燃 Vue 3 应用:状态管理革新之旅
前端·javascript·vue.js
微臣愚钝1 小时前
【12】Ajax的原理和解析
前端·javascript·ajax
徐小夕@趣谈前端2 小时前
从零到一开发电子病历编辑器(源码+教程)
前端·javascript·vue.js·编辑器·ecmascript