npm
是一个包管理工具,当我们安装nodejs
时,这个命令会默认安装。你可能非常熟悉npm run xxx
这个命令,每次上线前你都在执行npm run build
,甚至你常常在npm i
的等待中摸鱼。
当某一天你的同事在你电脑输入了一行命令...,npm view typescript versions
,你脑壳里想着,这
于是乎,你去官方文档查了下这个命令,原来npm view xx versions
是查询 xx
包所有可用版本。为了不拘泥于npm run start
与npm run build
这两行命令,于是笔者总结了这篇很深度,很广度的npm
命令大全,希望你能在你实际项目中能用得上。
正文开始...
npm init
代码语言:javascript复制npm init
// or npm init -y
该命令意思是初始化一个包项目,生成一个package.json
文件
可以一直enter
键下去,你也可以按你心情在控制台输入一些信息,然后enter
下去later
...
最后在你目录下生成了一个package.json
文件
{
"name": "npm-know",
"version": "1.0.0",
"description": "My first encounter with npm",
"main": "index.js",
"scripts": {
"test": "echo "Error: no test specified" && exit 1"
},
"keywords": [
"npm"
],
"author": "Maic",
"license": "ISC", // 以上都是默认的配置
}
另外如果你想在指定的目录中生成package.json
,那么你你只需执行下面一行命令npm init -w 01
, 01
是你当前已存在的目录,如果01
不存在,则会在你得根目录.Trash
中创建一个01/package.json
关于package.json
的一些解释
代码语言:javascript复制// name 包名,如果你需要发布一个npm包,那么这是必须的
// version 版本 同上,你需要发布一个包,那么版本是必须的 包名 版本构成一个包的唯一标识
// description 包名的描述,npm能根据这个描述检索你得包名
// main 程序的主要入口,默认index.js
// scripts 可以执行npm 指定运行的别名
// keywords 关键字,便于别人搜索关联找到你发布的包名
// author 发布该包的作者名
// license 许可证 通常是ISC或者MIT,便于开发者知道这是个开源可免费试用的包
关于package.json
的默认的配置就是这么多,接下来,你感兴趣的来了,她来了,她就是bin
...
{
...,
license: 'ISC',
"bin": {
"maic-app-cli": "./cli.js"
}
}
在官方解释这个bin
有点绕,我的理解的就是,提供一个可执行的接口命令,让你可以运行你写的包,能关联到当前的项目,不管是全局还是局部安装,npm
可以通过这个bin
的别名命令,执行指定包内的脚本,从而进行一系列的初始化工作。比如大名鼎鼎的vue-cli
和create-react-app
脚手架,当你看到vue-cli@2.96
版本package.json
时,可以看到vue
命令的操作
{
"name": "vue-cli",
"version": "2.9.6",
"description": "A simple CLI for scaffolding Vue.js projects.",
"preferGlobal": true,
"bin": {
"vue": "bin/vue",
"vue-init": "bin/vue-init",
"vue-list": "bin/vue-list"
},
...
}
前往bin/vue
目录你可以看到
#!/usr/bin/env node
const program = require('commander')
program
.version(require('../package').version)
.usage('<command> [options]')
.command('init', 'generate a new project from a template')
.command('list', 'list available official templates')
.command('build', 'prototype a new project')
.command('create', '(for v3 warning only)')
program.parse(process.argv)
这里就是熟悉的脚手架vue create xx
,vue init
的一些 xxx
项目的脚手架工作了,具体可以查看vue-cli 源码[1]
关于bin
的实际操作,后续会专门写一个自己的脚手架,再来细细了解下这些知识。
conig
,这个配置可以在你指定包名,版本升级时,一些特殊值可以保持不变。
dependencies
这是一个开发依赖,当你在你得cmd
控制台输入npm i ramda -s
时
package.json
中dependencies
生成了一个依赖文件"ramda": "^0.27.1"
。
devDependencies
是一个在生产环境需要依赖的包,dependencies
与devDependencies
的区别是:npm i xx -s
和npm i xx --save-dev
,在实际项目开发中,你可以把dependencies
安装的开发环境依赖包,在你打包的时候利用webpack
的externals
外部扩展特性分离出去,也就是将开发环境的包可以用cdn
加载,这样减少你生产环境的bundle.js
的体积,开发环境那部分依赖的包就可以单独cdn
引入,进而提升你项目的打包速度。
打开node_modules/ramda
,我们能从这个优秀的ramda
库中发现些什么, 注意scripts
在scripts
配置中有一个"build": "npm run build:es && npm run build:cjs && npm run build:umd && npm run build:umd:min && npm run build:mjs"
,ramda
是用rollup
打包的,这行命令可以将你的ramda
打包成不同模式,不仅支持按需引入还是script
标签引用的多种方式。关于rollup
打包,可以参考官网学习rollup.js[2]。
现在我们测试下自己配置的scripts
,当前目录下新建一个文件index.js
,并控制台运行npm run start
{
"name": "npm-know",
"version": "1.0.0",
"description": "My first encounter with npm",
"main": "index.js",
"scripts": {
"test": "echo "Error: no test specified" && exit 1",
"start": "node index.js"
},
...
}
index.js
写入测试代码
// 由于刚项目已经安装ramda,所以直接require该包
const R = require('ramda');
const cityMap = [
{
city: '北京',
},
{
city: '上海'
},
{
city: '深圳'
}
];
// 找到上海
const shanghaiCity = R.find(R.propEq('city', '上海'))(cityMap)
console.log(shanghaiCity)
测试结果如下:
在你执行npm run start
时,它与npm start
也是等价的,实际上当我们执行这行命令时本质上在执行node index.js
,前者相当于一个命令的别名,所以你看到ramda
的scripts
上配置了多行命令,"build": "npm run build:es && npm run build:cjs && npm run build:umd && npm run build:umd:min && npm run build:mjs",
,在ramda
中,这行命令执行了多行配置
在npm init
生成的package.json
内部还有其他的字段,更多可以参考官方文档pckage.json[3],你已经了解npm
最硬核的一些知识了,其它的,你就熟悉些配置时,比如支持操作系统、node 指定环境版本等等,巴拉巴拉...
npm -h
代码语言:javascript复制npm -h
这是一个查看npm
cmmand 有那些指令,等价于npm help
,如果你记不起 npm 有哪些命令,那么你可以用这个查看她的全家桶
npm i(npm install的简写)
代码语言:javascript复制npm i
// npm i -g 全局安装
// npm i xx@latest 安装最新xx版本的包
// npm i xx@1.x.x 安装指定版本的包
// npm i xx@1.x.x -s or npm i xx@1.x.x -d 安装到开发环境,包名会在dependencies
// npm i xx@1.x.x --save-dev 安装到生产环境,包名会在devDependencies
如果你package.json
的dependencies
或者devDependencies
有对应的包了,那么你执行该命令后,会在你当前项目中生成一个node_modules
文件夹,该文件下会下载你需要的包,应有尽有。
npm cache clear
代码语言:javascript复制npm cache clear
清除缓存包,在你运行项目,莫名其妙的报错的时候,除了删除node_modules
,有时候你执行这个命令,可能能帮助到你
npm bugs xxx
代码语言:javascript复制npm bugs ramda
这是一个很有用的命令,快速链接到你这个包的issue
,在issue
中会找到你遇到的一些问题,例如:cd node_modules/ramda
,执行命令npm bugs
,浏览器自动给你打开了该包issue
地址。(如果只是在你自己的项目根目录里,执行这个命令,这个命令会把以当前package.json
的 name,在 npm官网当成一个路由地址打开,那么就是 404 了,不信你可以试试)。
npm view ramda versions
查看ramda所有版本包
代码语言:javascript复制npm view ramda versions
// npm view ramda version 查看当前项目ramda版本
// npm view ramda@* 查看当前包的基本信息
如果你本地想安装一个vue
指定的版本,那么你可以先npm view vue versions
查到所有的版本,然后命令安装npm i vue@3.2.25 -s
那么就会安装该版本。就是这么简单,这个命令用起来,你终于不用去官网看版本了。
npm diff --diff=ramda@0.0.1 --diff=ramda@0.1.0
代码语言:javascript复制npm diff --diff=ramda@0.0.1 --diff=ramda@0.1.0
比较两个版本的不同,用到少。
npm docs ramda
代码语言:javascript复制npm docs ramda
这个命令打开ramda
的官方文档,就是package.json
里面的那个homepage
地址
npm update xxx
更新xxx包
代码语言:javascript复制npm update ramda // 更新ramda包
npm uninstall xxx
卸载xxx包
代码语言:javascript复制npm uninstall ramda
// 简写,等价于下面 npm un ramda or npm rm ramda or npm r ramda
npm pkg get xx1 xx2
代码语言:javascript复制npm pkg get name version
读取包名、版本等信息
接下来说几个关于npm
发包的几个关键命令
npm login
代码语言:javascript复制npm login
这中途需要npm
官方会给你发邮箱验证码,收到npm
注册的邮箱验证码,然后输入就OK了,这里以笔者n年前上传的一个包eazyutils
包为例。
npm publish
代码语言:javascript复制npm publish
(注意修改下package.json
的版本),否则提交不上
更多npm
命令参考npm commands[4]了,不常用的就没写了,因为那些不常用的,笔者也没用过,哈哈。关于更多npm
的命令最好的学习方式就是找官方文档查询,本以为你看到这里,以为总结了所有npm
命令,但是....,笔者文章已经覆盖了项目里所用到的绝大部分场景。
总结
- npm常用的
command
命令,譬如高频命令npm view xxx versions
,npm update@lastest
、npm un xxx
、npm i xx -s
,常用的增删查改
基本已经涵盖了。 - 了解
package.json
关键的几个字断意思,但是bin
这个你必须要知道,因为她,你可以任性创建一个自己的xx-cli
了 npm
如何发布一个全世界都能看到,全世界都能下载的npm
包,以n年前的一个简单eazyutils
包为例。
源码地址:https://github.com/maicFir/lessonNote/tree/master/webpack/npm
参考资料
[1]vue-cli源码: https://github.com/vuejs/vue-cli/blob/v2
[2]rollup.js: https://www.rollupjs.com/
[3]pckage.json: https://docs.npmjs.com/cli/v8/configuring-npm/package-json
[4]npm commands: https://docs.npmjs.com/cli/v8/commands