nodejs进阶教程,小白绕道!!!

npm使用技巧和最佳实践

前提:请确保安装了node.js

npm的最佳实践

npm install是最常见的npm cli命令,但是它还有更多能力!接下来你会了解npm是如何在应用的整个生命周期帮助你的-从创建一个项目到开发和部署整个生命周期

认识npm

在开始之前,我们先来看看一些查看正在运行的npm版本的命令

npm version

获取当前npm cli正在使用的版本,你可以执行命令 npm version,这条命令除了返回版本外,还可以返回很多信息-当前包的版本,你正在使用的node.js的版本,openSSL或者V8的版本,以我本地安装的node为例,结果如下:

npm help

和大多数的命令行工具一样,npm也有一个内置的帮助函数, 可以获取命令的描述和提要,比入我们想看看npm test命令是做什么的,执行 npm help test

1 使用 npm init创建新项目

使用 npm init命令可以帮助你交互式地创建 package.json文件,会弹出项目名称和描述的问题,有一个快速的解决方法 npm init--yes(或者简写 npm init-y),那么就不会弹出任何问题了,仅仅是使用默认配置创建一个 package.json, 使用下面的命令,你可以配置这些默认配置

  1. npm config set init.author.name YOUR_NAME
  2. npm config set init.author.email YOUE_EMAIL

2 查找正确的npm包

查找正确的npm包相当具有挑战性-有成千上万的包可供选择,因此选择正确的npm 包很令人苦恼了,然而,我们可以选择一个模块帮助我们发送HTTP请求 有一个网站可以帮助我们简单地完成这个任务,它就是npms.io,它会展示包的质量,受欢迎度,和维护性,这些是通过一个模块是否更新了依赖,是否有提示配置,是否做了测试覆盖,最近有没有提交记录来综合计算得出的

3 检查npm包

一旦我们找到了我们的模块(在我们的例子中是一个request模块),我们应该看一下文档,查看issues,以便更好地了解我们即将引入到应用中的包,不要忘记你使用的npm包越多,你的项目的风险就越高

如果你想在cli中打开这个模块的首页,执行

npm home request

打开模块的issues

npm bugs request

或者你只是想查看模块的git仓库,执行下面的命令

npm repo request

4 保存依赖

npm采用semver进行控制

所谓SEMVER,指的是语义化版本,其规则概述如下: 版本格式:主版本号.次版本号.修订号,版本号递增规则如下:

  • 主版本号:新的架构调整,不兼容老版本
  • 次版本号:新增功能,兼容老版本
  • 修订号:修复bug,兼容老版本。

一旦你决定将第三方包引入你的项目,你必须安装和保存它,最常见的命令是 npm install some-package,如果你想自动将包信息添加进 package.json文件,你需要执行 npm install some-package--save

npm默认会带着'^’这个前缀保存你的包,具体的安装规则如下:

^version

  1. 兼容某个版本
  2. 版本号中最左边的非0数字的右侧可以任意
  3. 如果缺少某个版本号,则这个版本号的位置可以任意
  4. 如:^1.1.2 ,表示>=1.1.2<2.0.0,
  5. 可以是1.1.2,1.1.3,.....,1.1.n,1.2.n,.....,1.n.n
  6. 如:^0.2.3 ,表示>=0.2.3 <0.3.0,
  7. 可以是0.2.3,0.2.4,.....,0.2.n
  8. 如:^0.0,表示 >=0.0.0 <0.1.0,
  9. 可以是0.0.0,0.0.1,.....,0.0.n

这也意味着当你下次执行 npm install的时候,即使主版本没有更改,次版本或者修订版本发生了改变,你的这个模块会重装,你可以执行下面的命令修改安装包版本规则 npm configsetsave-prefix='~'

这个包前缀的安装规则如下:

~version

  1. 大概匹配某个版本
  2. 如果minor版本号指定了,那么minor版本号不变,而patch版本号任意
  3. 如果minor和patch版本号未指定,那么minor和patch版本号任意
  4. 如:~1.1.2,表示>=1.1.2 <1.2.0,可以是1.1.2,1.1.3,.....,1.1.n
  5. 如:~1.1,表示>=1.1.0 <1.2.0
  6. 如:~1,表示>=1.0.0<2.0.0,
  7. 可以是1.0.0,1.0.1,.....,1.1.n,1.2.n,.....,1.n.n

如果你想保存指定的版本号,执行 npm configsetsave-exacttrue

5 锁定依赖

上面已经介绍过了,npm采用语义化的版本号 semver 进行控制,让开发过程中依赖的获取和升级变得非常容易,但不严格的版本号控制,也带来了不确定性

  • npm建议使用semver版本,但是部分包不遵循semver;
  • package.json 可以使用精确的版本号控制你的直接依赖包,但第三方依赖的包无法管理;
  • 在开发阶段执行得到的包的版本,和后续部署时得到的可能是不一致的,更不可控的是,你依赖的第三方包也有这样的情况会导致潜在的上线风险。

可以用 npm shrinkwrap解决这个问题,这条命令会生成一个npm-shrinkwrap.json,这个文件里面不仅包含了安装在你机器上的指定版本的包,而且还有包的指定版的依赖包,一旦在项目的根目录下有这个文件,你执行 npm install命令会重新生成一个相同的依赖树

6 检查项目的依赖包有无更新

npm有一个内置的工具方法命令 npm outdated可以检查过时的包,在你项目下运行`npm outdated'即可,但是手动执行检查更新命令就很烦了,有一个可以自动执行包更新检查的工具Greenkeeper,有兴趣的童鞋可以戳进链接了解。

7 开发包

在本地开发npm包的时候,我们可以使用 npm link命令,将npm模块链接到对应的运行项目中去,方便地对模块进行调试和测试

举个例子来说明是什么意思以及怎么使用吧

我们现在有两个项目,分别是npm-link-module和npm-link-test,其中npm-link-module是我们要开发的npm包,npm-link-test用来测试我们开发的包

在npm-link-module下执行 npm init-y生成一个默认的包配置文件package.json,在目录下新建index.js如下,写个简单的日期转换函数

  1. function formateTime(date) {
  2. let year = date.getFullYear();
  3. let month = date.getMonth() + 1;
  4. let day = date.getDay();
  5. month = month < 10 ? '0' + month : month;
  6. day = day < 10 ? '0' + day : day;
  7. return year + '-' + month + '-' + day;
  8. }
  9. module.exports = formateTime

然后执行 npm link, 执行命令后,npm-link-module会根据package.json上的配置,被链接到全局,路径是 {prefix}/lib/node_modules/<package>,这是官方文档上的描述,我们可以使用npm config get prefix命令获取到prefix的值(我使用的是windows,实际被链接到的路径是 {prefix}/node_modules/<package>) 我们可以看到,已经在这个目录下面生成了一个npm-link-module的快捷方式

再进入npm-link-test,执行 npm init-y生成包文件,接着执行 npm link npm-link-module 可以看到在这个项目的node_modules目录下生产了一个npm-link-module的快捷方式 现在npm-link-test这个项目就可以引用这个 npm-link-module这个模块了

我们在npm-link-test的目录下新建index.js文件,内容如下

  1. let formateTime = require('npm-link-module');
  2. let date = new Date();
  3. console.log(formateTime(date));

然后执行node index.js,可以看到命令行已经打印出函数的执行结果了

然后,我们修改下npm-link-module中的index.js文件的日期函数,返回结果就修改成返回斜线格式的日期

  1. return year + '/' + month + '/' + day;

再回到npm-link-test目录下执行index.js,可以看到,返回结果已经变成了斜线的日期

看到了吧,所有对npm-link-module的修改会被直接映射到npm-link-test/node_modules/npm-link-module

说明一下,这个nodejs进阶教程计划写10篇左右,现在心中有大致的框架,所以准备边写边梳理,写完会将教程目录列出来

下面是我的个人前端公众号,欢迎大家扫码关注,第一时间获取教程的更新信息

nodejs进阶(1)——npm使用技巧和最佳实践的更多相关文章

  1. 【转】超实用的JavaScript技巧及最佳实践

    众所周知,JavaScript是一门非常流行的编程语言,开发者用它不仅可以开发出炫丽的Web程序,还可以用它来开发一些移动应用程序(如PhoneGap或Appcelerator),它还有一些服务端实现 ...

  2. 超实用的JavaScript技巧及最佳实践

    众所周知,JavaScript是一门非常流行的编程语言,开发者用它不仅可以开发出炫丽的Web程序,还可以用它来开发一些移动应用程序(如PhoneGap或Appcelerator),它还有一些服务端实现 ...

  3. 超实用的JavaScript技巧及最佳实践(上)

    在这篇文章中,作者将会向大家分享JavaScript开发的小技巧.最佳实践等非常实用的内容,不管你是前端开发者还是服务端开发者,都应该来看看这些小技巧,它们绝对会让你受益的. 文中所提供的代码片段都已 ...

  4. 避免Java应用中NullPointerException的技巧和最佳实践

    Java应用中抛出的空指针异常是解决空指针的最好方式,也是写出能顺利工作的健壮程序的关键.俗话说"预防胜于治疗",对于这么令人讨厌的空指针异常,这句话也是成立的.值得庆幸的是运用一 ...

  5. 避免Java中NullPointerException的Java技巧和最佳实践

    Java中的NullPointerException是我们最经常遇到的异常了,那我们到底应该如何在编写代码是防患于未然呢.下面我们就从几个方面来入手,解决这个棘手的​问题吧.​ 值得庆幸的是,通过应用 ...

  6. npm常用命令学习(npm install -D,semver版本规范, npm进行版本管理的最佳实践用法)

    什么是npm npm有两层含义.一层含义是Node的开放式模块登记和管理系统,网址为npmjs.org.另一层含义是Node默认的模块管理器,是一个命令行下的软件,用来安装和管理Node模块. npm ...

  7. 京东前端:PhantomJS 和NodeJS在网站前端监控平台的最佳实践

    1. 为什么需要一个前端监控系统 通常在一个大型的 Web 项目中有很多监控系统,比如后端的服务 API 监控,接口存活.调用.延迟等监控,这些一般都用来监控后台接口数据层面的信息.而且对于大型网站系 ...

  8. 45 Useful JavaScript Tips, Tricks and Best Practices(有用的JavaScript技巧,技巧和最佳实践)

    As you know, JavaScript is the number one programming language in the world, the language of the web ...

  9. 30 个java编程技巧(最佳实践的初学者)

    1.return 一个空的集合,而不是 null 如果一个程序返回一个没有任何值的集合,请确保一个空集合返回,而不是空元素.这样你就不用去写一大堆 ”if else” 判断null元素. Java 的 ...

随机推荐

  1. jquery li练习

    <!DOCTYPE html><html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...

  2. Expression Blend学习5控件

    原文:Expression Blend学习5控件 Expression Blend ButtonStyle- TextButton 本章以TextButton为例,讲解如何最简单,最快速的制作一个专业 ...

  3. 什么是OTC?

    OTC(Over The Counter)非处方药物,我国卫生部医政司是这样定义的:它是消费者可不经过医生处方,直接从药房或药店购买的药品,而且是不在医疗专业人员指导下就能安全使用的药品,即不需要凭借 ...

  4. 论文阅读计划2(Deep Joint Rain Detection and Removal from a Single Image)

    Deep Joint Rain Detection and Removal from a Single Image[1] 简介:多任务全卷积从单张图片中去除雨迹.本文在现有的模型上,开发了一种多任务深 ...

  5. 比快更快——微软LightGBM

    LightGBM介绍 xgboost是一种优秀的boosting框架,但是在使用过程中,其训练耗时过长,内存占用比较大.微软在2016年推出了另外一种boosting框架--lightgbm,在不降低 ...

  6. 将Imagelist里的图像复制到TCanvas上的指定区域

    function Tdmd.Draw_Image_In_Rect(C:TCanvas;R:TRect;i:integer):boolean;var  tr:TRect;begin    if i< ...

  7. 设置windows2008系统缓存大小限制,解决服务器运行久了因物理内存耗尽出僵死(提升权限后,使用SetSystemFileCacheSize API函数,并将此做成了一个Service)

    声明: 找到服务器僵死的原因了,原因是虚拟内存设置小于物理内存. 只要虚拟内存设置为系统默认大小就不会出生僵死的现象了. 当时因为服务器内存48G,系统默认虚拟内存大小也是48G, 觉得太占硬盘空间, ...

  8. 在SYSTEM权限下以当前用户权限运行程序

    http://download.csdn.net/download/lai444132348/9730266 using System; using System.Runtime.InteropSer ...

  9. Linux 下配置 phpredis 的过程和遇到的问题

    其实对于 Linux 系统和 LNMP 环境并不是很熟,如果有错误请指正. 一.关于 PHP PHP 的编译参考了此文:http://blog.aboutc.net/linux/65/compile- ...

  10. 分享Node.js + Koa2 + MySQL + Vue.js 实战开发一套完整个人博客项目网站

    这是个什么的项目? 使用 Node.js + Koa2 + MySQL + Vue.js 实战开发一套完整个人博客项目网站. 博客线上地址:www.boblog.com Github地址:https: ...