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