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
相关推荐
阿蒙Amon1 分钟前
JavaScript学习笔记:17.闭包
javascript·笔记·学习
Wpa.wk3 分钟前
自动化测试 - 文件上传 和 弹窗处理
开发语言·javascript·自动化测试·经验分享·爬虫·python·selenium
l1t5 分钟前
利用小米mimo为精确覆盖矩形问题C程序添加打乱函数求出更大的解
c语言·开发语言·javascript·人工智能·算法
composurext14 分钟前
录音切片上传
前端·javascript·css
程序员小寒14 分钟前
前端高频面试题:深拷贝和浅拷贝的区别?
前端·javascript·面试
zhougl99620 分钟前
Vue 中的 `render` 函数
前端·javascript·vue.js
跟着珅聪学java22 分钟前
HTML中设置<select>下拉框默认值的详细教程
开发语言·前端·javascript
想睡好29 分钟前
setup
前端·javascript·html
桜吹雪36 分钟前
DeepSeekV3.2模型内置Agent体验
javascript·人工智能
逆向新手39 分钟前
js逆向-某省特种设备aes加密研究
javascript·爬虫·python·逆向·js