time: 2020.5.12
最近在做公共组件规范的时候,了解到在打包器打包时,从 node_modules 中去寻找相应的库,从当前目录层级开始,往上查找,直到找到文件顶层。
当前最火的前端架构是
基本环境:nodejs
包管理器:npm
构建工具:webpack,rollup, parcel,vite
es转义:babel
框架:vue, react
移动端:flutter
桌面:electron
npm 作为最流行的包管理器,在 npm init -y
之后,会生成一个 package.json 文件,保存相关包依赖。webpack 等构建工具,也都是依据 package.json 来查找相应包。
自己使用了这么久的 npm ,对其完整知识点还没有有过一次总结,也没有归纳相应的问题,特此总结。
nodejs 作为前端开发环境,使用 npm 作为包管理器,第三方包放在 node_modules 目录中,使用 package.json 来描述模块信息
npm init -y
,初始化为一个 npm 项目,生成 package.json 文件.npmignore
,在需要发布为 npm 包时,可以忽略发布部分文件npm update
,执行之后,再执行 npm outdated
,正常不会有其他输出-g
参数即可npm adduser
, npm whoami
, npm login
, npm version
, npm publish
,可以使用 --registry=http://
来调整目标源@scope/
开头的包,通常也是私有包,发布 scoped package 时npm dist-tag add <pkg>@<version> [<tag>]
来打 tag,从而用户可以指定下载某个版本或标签的 packagenpm profile get|set
可以列出用户信息,包含了 name, email, two factor auth, twitter, github 等,也可以修改密码npm link
:用于本地开发链接多个仓库npm unpublish
和 npm deprecate
指定 package@versionpreinstall
, postinstall
可以在我们执行 npm install
的过程前后执行对应的 script 命令较深入问题:
node_modules 下的包入口有多种方式
index.js
作为入口main
字段表示作为 nodejs modules 的核心入口browser
字段表示作为 browser 核心入口通过在 package.json 中的 bin 字段指明可执行命令及其可执行文件路径,可以添加对应的命令到环境中, { "bin" : { "myapp" : "./cli.js" } }
./node_modules/.bin/
/usr/local/bin/
[major, minor, patch]
version
: 严格匹配>version
: 版本必须大于>=version
: etc<version
: etc<=version
: etc~1.2.3
: 版本大于等于 1.2.3,小于 1.3.0^1.2.3
: major大于0时,<= 2.0.0;major等于0,则不能超过minor;minor也为0,则版本不可变更1.2.x
: 1.2.0, 1.2.1 都行,就是不能 1.3.1总结:~ 表示不能超过中间的 minor 版本,^ 在版本大于1时,不能超过主要 major+1 版本,^ 在版本小于1时,不能超过 minor+1 版本
通常我们全局安装的包在 /usr/local/lib/node_modules
目录下,全局安装的命令在 /usr/local/bin
下,可以使用 npm prefix -g
来查看我们全局安装的路径
/usr/local/lib/node_modules
npm link ../hello
,表示在当前项目中,先进入上级的 hello 项目中,执行 npm link,然后回到当前项目,执行 npm link hello疑问:npm link 有效期多久?link 和 install 会互相覆盖吗?
dependencies
npm link
npm 中文文档
npm package.json 文档
npm semver version