【Node Hero】2. 使用 NPM

接单狂魔
• 阅读 2956

本文转载自:众成翻译
译者:网络埋伏纪事
链接:http://www.zcfy.cc/article/1749
原文:https://blog.risingstack.com/node-hero-npm-tutorial/

本章将学习什么是 NPM,以及如何使用它。我们开始吧!

NPM 概述

NPM 是 Node.js 应用程序所用的包管理器 - 你可以在 NPM 中找到大量模块,这样你就不用重新造轮子了。它就像 Java 的 Maven 或者 PHP 的 Composer。与 NPM 交互有两种主要的接口 - NPM 网站以及 NPM 命令行工具。

网站和 CLI 使用同样的注册库来显示模块以及查找模块。

NPM 网站

NPM 网站地址为 https://npmjs.com。你可以注册成一个新用户,或者只查找包。

【Node Hero】2. 使用 NPM

命令行界面

要运行 CLI,只需执行:

npm

注意,NPM 是与 Node.js 二进制文件捆绑在一起的,所以不必安装它 - 但是,如果想使用指定的 npm 版本,可以更新它。如果想安装 npm 第三版,那么就可以执行:npm install npm@3 -g

使用 NPM

在上一章 开始使用 Node.js 中,当创建 package.json 文件时,已经遇到了 NPM。下面我们继续扩展知识!

添加依赖

本节将学习如何给应用程序添加运行时依赖。

有了 package.json 文件之后,就可以给应用程序添加依赖了。下面我们先添加一个!试试下面的命令:

npm install lodash --save  

用这一条命令,我们做了两件事情:首先,lodash 被下载,并放到 node_modules 文件夹。所有外部依赖都会放在这个文件夹中。一般不会将这个文件夹添加到源代码管理,所以如果你在用 git,要确保将 lodash 添加到 .gitignore 文件中。

这对你的 .gitignore 是一个好起点。

# Logs
logs
*.log
npm-debug.log*

# Runtime data
pids
*.pid
*.seed

# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov

# Coverage directory used by tools like istanbul
coverage

# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt

# node-waf configuration
.lock-wscript

# Compiled binary addons (http://nodejs.org/api/addons.html)
build/Release

# Dependency directories
node_modules
jspm_packages

# Optional npm cache directory
.npm

# Optional REPL history
.node_repl_history

现在我们来看看 package.json 文件中有啥变化!文件中出现了一个新属性dependencies

"dependencies": {
  "lodash": "4.6.1"
}

这意味着 lodash 版本 4.6.1 现在安装好了,可以使用了。注意,NPM 遵循 SemVer 规则来控制包的版本。

假设版本号格式为 “主版本号.次版本号.补丁版本号”,当作出不兼容的 API 修改时,增加主版本号;当以向后兼容的方式添加功能时,增加次版本号;当作出向后兼容的错误修正时,增加补丁版本号。更多信息参见:http://semver.org/

既然 lodash 已经可以用了,我们来看看能怎么用!可以像你用自己的模块一样的方式用它,不过现在不需要定义路径,只需要模块的名称:

// index.js
const _ = require('lodash')

_.assign({ 'a': 1 }, { 'b': 2 }, { 'c': 3 });  
// → { 'a': 1, 'b': 2, 'c': 3 }

添加开发依赖

本节将学习如何把构建时依赖添加到应用中。

在创建 Web 应用程序时,可能需要压缩 JavaScript 文件,合并 CSS 文件等等。做这种事情的模块只会在资源构建期间运行,所以运行的应用程序不需要它们。

你可以像这样安装这些脚本:

npm install mocha --save-dev  

之后,package.json 文件中会出现一个称为 devDependencies 的新小节。所有带有 --save-dev 安装的模块都会被放在这里 - 它们也会被放在同一 node_modules 目录中。

NPM 脚本

NPM 脚本是一个很强大的概念 - 有了它们相助,就可以创建小的实用工具,甚至构成复杂的构建系统。

最常见的就是 starttest 脚本。用 start 脚本可以定义别人如何启动你的应用程序,用 test 脚本定义如何运行测试。在 package.json 中,它们可以像这样:

  "scripts": {
    "start": "node index.js",
    "test": "mocha test",
    "your-custom-script": "echo npm"
  }

这里要注意的事情:

  • start: 很简单,它只描述应用程序的起点,可以被 npm start 调用。

  • test: 用途是执行你的测试 - 这里有个陷阱,在本例中 mocha 不需要全局安装,因为 npm 会在 node_modules/.bin 文件夹下查找它,而 mocha 也会放在这里。它可以用 npm test 调用。

  • your-custom-script: 任何你想要的东西,你可以挑任何名称。它可以用 npm run your-custom-script 调用 - 不要忘记 run 部分!

作用域包/私有包

起初 NPM 对于模块名称有一个全局共享的命名空间 - 在注册库中有超过 250,000 个模块,大部分简单名称都已经被采用了。此外,全局命名空间只包含公共模块。

NPM 通过引入作用域包(Scoped Package)来解决此问题。作用域包有如下命名模式:

@myorg/mypackage

可以采用与以前一样的方式安装作用域包:

npm install @myorg/mypackage --save-dev  

它会以如下方式出现在 package.json 中:

"dependencies": {
  "@myorg/mypackage": "^1.0.0"
}

不出所料,请求作用域包应该是如下方式:

require('@myorg/mypackage')  

更多信息,请参考 NPM 作用域模块文档

下一步:异步编程

下一章学习使用回调和 Promises 实现异步编程的原理

【Node Hero】2. 使用 NPM

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Stella981 Stella981
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Easter79 Easter79
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
美凌格栋栋酱 美凌格栋栋酱
4个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(