Mosh的Node.js教程(五)

作者:大志前端
链接:https://juejin.cn/post/6844904066158624781
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


前言

本系列文章是根据Mosh大佬的视频教程全方位Node开发 - Mosh整理而成,个人觉得视频非常不错,所以计划边学习边整理成文章方便后期回顾。该视频教程是英文的,但是有中文字幕,感谢marking1212提供的中文字幕翻译。

本篇文章大纲

  • 查看包的注册信息
  • 安装特定版本的包
  • 升级本地包
  • 开发用依赖库
  • 删除包
  • 操作全局包
  • 发布一个包
  • 发布包更新

查看包的注册信息

之前有说过如果想了解npm的包,我们可以访问npmjs.com并搜索特定的包,比如mongoose

image

<figcaption></figcaption>

通过切换tab标签,可以查看mongoose这个包的一些基本信息,比如依赖、版本等等。

但是有一种更快的方法,回到控制台,我们运行npm view,并指定特定的库,比如mongoose

npm view mongoose
复制代码

控制台输出如下图

image

<figcaption></figcaption>

这里我们看到的是mongoose库的package.json的一部分内容,比如dependencies

这些内容太多了,如果我们只想查看依赖的信息,可以运行

npm view mongoose dependencies
复制代码

这里你可以添加任何package.json中的对象,比如我想查看关键词就运行npm view mongoose keywords

运行后,控制台输出如下图

image

<figcaption></figcaption>

这里你就只看到依赖对象的值。

另一个有用的属性是version,如果你想查看至今为止所有发布的mongoose的版本号,可以运行

npm view mongoose versions
复制代码

控制台输出如下图

image

<figcaption></figcaption>

这就是mongoose库的所有版本号,这有用的地方在于有时你想回滚旧版本或者升级新版本,这里你就可以看到历史数据。

如果只想查看最新的版本号,可以运行

npm view mongoose version
复制代码

注意少了一个s

安装特定版本的包

有时候我们需要安装特定的版本而不是最新版本,我们可以运行npm i mongoose,添加一个@符号设置版本号,比如4.13.18

npm i mongoose@4.13.18
复制代码

运行后,我们看下package.json文件已经更新了,我们安装好了mongoose4.13.18版本,如下图

image

<figcaption></figcaption>

同样的运行npm list同时设置深度参数为0,可以看到在node_modules文件夹中,mongoose的版本是4.13.18

npm list --depth=0
复制代码
image

<figcaption></figcaption>

这里你可以试着安装underscore包的某个指定版本练习一下。

升级本地包

在现实中开发软件的时候,也许经常需要对已安装依赖库的升级,你肯定想快速了解已安装的和已发布的库,查看的命令是

npm outdated
复制代码

控制台输出如下图

image

<figcaption></figcaption>

这时候npm会查看已安装版本和对比在npm注册库中发布的版本,我们以mongoose为例看看发生了什么

  • Current 4.13.18 当前版本
  • Wanted 4.13.20 期待的版本
  • Latest 5.9.1 最新的版本

这里的期待是什么意思呢?回到package.json文件看看,我们安装的mongoose^4.13.18,这里有个插入符号,只要主要版本是4,这个版本就可以用于更新本地的应用,这里具体就是主要版本为4的最新版本是4.13.20,这就是这里期待的含义。

如果我们想升级,就运行npm update,但是这样只会更新次要版本和补丁版本,因为没有主要升级,mongoose就不会安装到最新版了,最新版本已经和现有版本差了一个主要版本号了,很可能已经有核心部分的更新了。

我们来运行一下看看,控制台输出如下图

image

<figcaption></figcaption>

可以看到命令更新了一个内容,mongoose只更新到了主要版本为4的最后更新4.13.20,就是我们上面期待列显示的版本号,如果我们想更新到最新发布的版本5.9.1npm update是做不到的,这里需要另一个命令行工具,这个包是npm-check-updates,我们来安装一下,运行

npm i -g npm-check-updates
复制代码

安装好了,我们在运行一下

npm-check-updates
复制代码

就能看到所有已安装包和可安装的包,如下图

image

<figcaption></figcaption>

这里显示的是mongoose的已安装版本是4.13.20,但是最新的版本是5.9.1,这里提示你运行ncu,也就是npm-check-updates的缩写,加入-u参数更新package.json,我们来运行一下

ncu -u
复制代码

运行后,你可以看到package.json文件已经更新了,mongoose已经到了最新版5.9.1

image

<figcaption></figcaption>

但是这个更新只是更新了package.json,还没更新依赖,我们还需要运行一下npm i才可以。

运行完,如果我们再来运行一下npm outdated,控制台没有任何输出,因为所有本地库都更新到最新了,类似的,如果运行ncu,同样的提示也是依赖库都是最新的,如下图所示

image

<figcaption></figcaption>

开发用依赖库

到现在所有安装的依赖都是服务于应用的,比如mongooseunderscore,我们的应用因为功能才需要这些依赖库,但是有时候我们需要一些只在开发中使用的库,例如我们需要进行单元测试的工具,我们需要静态分析代码的工具,我们需要打包JavaScript代码的工具等等,这些依赖是开发用依赖库,这些库在发布的时候不用一起发布,这边我们来演示安装一个开发依赖。

这是一个JavaScript代码静态分析工具依赖,这主要用来分析代码,找出可能的语法错误,我们运行npm i jshint,为了声明这是个开发用依赖,我们需要加一个参数--save-dev

npm i jshint --save-dev
复制代码

现在回到package.json,可以看到jshint在独立的属性下devDependencies,如下图所示

image

<figcaption></figcaption>

这就告诉node这是一个开发用依赖,不需要发布到生产环境,所有的依赖除了应用依赖都是开发用依赖,它们都保存在node_modules文件夹,它们只在package.json文件中才有区分。

删除包

到现在,我们已经学会安装包和升级包了,现实开发中也许因为不需要你就会想删除一个包,如果是这种情况,在控制台运行npm uninstall或者简写npm un,并指定特定的包,比如mongoose

npm un mongoose
复制代码

运行后,现在package.json文件中mongoose已经不在依赖属性中了,同时它在也不在node_modules文件夹中了。

操作全局包

所有至今我们安装的包,比如underscorejshint,它们都特定处于某个node工程文件夹中,但是有些是node注册库,不是针对某个应用的,这些通常是命令行工具,你可能想从任何地方访问,它们不是为某个特别的文件夹或者工程设计的,npm就是这类全局工具的代表,它是一个命令行工具,可以在任何地方运行,不限于某个文件夹,另一个很常见的工具就是Angular cli,我们使用它创建一个新的Angular工程。

如果你想全局性安装一个包,可以使用-g参数,就像之前说的,例如npm i -g然后加特定的包名,这就是如何安装全局包,所有其他你在本课程学到的命令行工具都是全局的。例如你想查看所有可更新的全局工具包,可以运行

npm -g outdated
复制代码

你可以看到所有已安装的全局包。

类似的如果你想删除一个全局的包,可以运行npm un -g并指定一个特定包的名称。

发布一个包

我们可以创建自己的包并发布到npm注册库,我们来看看如何实现?

  1. 首先要创建一个新文件夹,我创建一个新的node工程,比如叫做lion-lib,我们创建一个库叫lion,就像underscore一样
  2. 进入lion-lib文件夹,先创建一个package.json,输入npm init --yes,创建完package.json,回到VSC打开
  3. 新建一个新的文件index.js,这是我们包的入口

我们随便写点东西,比如导出一个简单的函数,接收两个参数,返回它们的和

module.exports.add = function (a, b) {
    return a + b;
}
复制代码

回到控制台,如果你没有npmjs的账户,你首先需要创建一个账号,我们可以使用npm adduser命令来创建。

如果你已经有账号了,就使用另一个命令npm login来登录,你需要回到3个问题

  1. 第一个是用户名
  2. 然后是你的密码
  3. 最后是你的email地址

登录后,为了发布包,我们运行npm publish,当发布的时候会碰到一个错误,因为你无权修改lion包,如下图

image

<figcaption></figcaption>

为了解决这个问题,回到package.json文件,设置一个独一无二的名字,设置namelion-lib-5238,后面加一些随机的数字,只是为了实现唯一的包名称。然后回到控制台,运行npm publish,控制台提示发布成功了,如下图

image

<figcaption></figcaption>

现在已经在npm发布了包,我们看看如何在应用中使用它。

我们新建一个项目node-app,进入这个项目,执行npm init --yes初始化一下项目,运行

npm i lion-lib
复制代码

回到VSC,可以看到node_modules文件夹里面多了一个lion-lib文件夹,里面也有package.json文件,这个文件跟我们未发布时的不一样,多了很多内容,这是因为我们发布包的时候,node会创建自己的package.json

image

<figcaption></figcaption>

打开package.json文件,里面的dependencies属性也有了lion-lib依赖

image

<figcaption></figcaption>

接下来我们在根目录新建一个index.js文件,把我们的包引入进来,代码如下

const lion = require('lion-lib');

var result = lion.add(1, 2);

console.log(result);
复制代码

回到控制台,运行node index.js,控制台输出3,如下图

image

<figcaption></figcaption>

我们自己发布的包已经可以正常使用了。

发布包更新

回到我们的lion-lib包,我们想添加一个新功能,导出一个multiply函数,同样需要两个参数,返回它们的乘积。

module.exports.add = function (a, b) {
  return a + b;
}

module.exports.multiply = function (a, b) {
  return a * b;
}
复制代码

现在我们想发布这个新版本,在lion-lib文件夹中,如果你运行npm publish,会得到一个报错,你不能发布与现有版本号重复的版本,如下图

image

<figcaption></figcaption>

依照我们之前作出的修改,我们应该修改版本号,这里我们作出一个小修改,不是修复错误,它添加了一个新的特性,但没有破坏原有功能的api,之前的add函数还是好好的,所有其他依赖于这个函数的应用都能正常工作,现在回到package.json文件,我们可以手工更新版本号,或者借助npm,回到控制台,运行npm version,后面可以加上major,如果你更新的是主要版本号,或者minor,或者patch,这里我们要更新的是minor次要版本号,我们运行

npm version minor
复制代码

如你所见,版本号变为了1.1.0,如下图

image

<figcaption></figcaption>

然后就可以运行npm publish了,这就向npm发布了新的版本,如下图

image

<figcaption></figcaption>

好了,本篇文章先到这里。

最后

感谢您的阅读,希望对你有所帮助。由于本人水平有限,如果文中有描述不当的地方,烦请指正,非常感谢。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,776评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,527评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,361评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,430评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,511评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,544评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,561评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,315评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,763评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,070评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,235评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,911评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,554评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,173评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,424评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,106评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,103评论 2 352

推荐阅读更多精彩内容