【Node.js】 Node.js与NPM入门

Posted by 西维蜀黍 on 2017-03-11, Last Modified on 2021-10-17

引入

近两年来,Node.js渐火。还有大厂用Node.js来做前后端分离,把更偏展示逻辑的C端(常见的Web框架中MVC架构)用Node.js重构,而让后端更专注于业务开发(详细可参考 Web 研发模式的演变)。

**增加Node层后的架构:

让我们逐一来介绍Node.js和NPM。

Node.js

Node.js是啥

  • Node.js 是一个基于 Chrome V8 引擎的跨平台的 JavaScript 运行环境。换句话而言,可以用JavaScript 来写传统的后端代码。

  • Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。

  • **npm(node package manager)**是Node.js 的包管理器,是全球最大的开源库生态系统。

Node.js的运行引擎

浏览器一般包括渲染器JavaScript脚本引擎。以Chrome浏览器为例,从28版本以后,采用Blink (Blink 是基于 WebKit 的一个fork分支)布局渲染器(layout engine) 和 V8 脚本引擎。

因 V8 脚本引擎运行速度极快,Node.js 采纳了 V8 引擎作为其执行脚本的引擎,V8 引擎的本质其实是一个 JavaScript 运行引擎。

npm

npm 是 Node.js 的包管理器,完全采用 JavaScript 编写。

npm 是有超过 280000 个第三方包供开发者使用,任何的开发者也可以上传自己的包到 npm 上。

Node.js的安装

你可以在 nodejs.org上,根据自己的平台下载到对应的 Node.js 版本进行安装。

当然,你也可以采用操作系统下的包管理器进行安装,如choco(Windows)、brewhome(Mac)。

// Winodws下
$ choco install nodejs

// Mac下
$ brew install node

不管采用哪种方法安装,安装完成后,在 Conosle 下输入 node ,如果如下显示,则表明安装成功了。

Node.js简单使用

直接运行代码

输入 node,可以类似 Python 那样,采用实时交互的方式编程。

执行.js脚本

当然,也可以直接执行 .js 脚本。

第三方库引用管理

引入第三方库的两种模式

在一个项目可以,可以通过 npm 引入第三方库(类似Java中在Project中引入Jar包),且有两种模式,称为local(本地)和global(全局)。

local模式

在local模式下,它会将本项目需要的第三方库放置在 node_modules 文件夹(位于工作目录的父目录)中。这些第三方库仅限于给本项目使用。

我们可以用npm install <Package name>来安装一个local第三方库。

global模式

Global模式,可以理解在本机的全局内都可以使用这个库。

我们可以用npm install <Package name> -g来安装一个全局第三方库。

global 的安装路径:

可以使用npm config get prefix查看这些 global 的安装路径。

  • 对非Windows用户,会安装在root用户下{prefix}/lib/node_modules/({prefix}通常是/usr/或者/usr/local)。这就意味需要使用sudo命令来安装global包,否则当解析第三方包依赖时,出于安全考虑可能会出现权限错误。
  • 对Windows用户,默认安装在C:\Users\{UserName}}\AppData\Roaming\npm\node_modules中。

注意

-f参数

安装之前,npm install会先检查,node_modules目录之中是否已经存在指定模块。如果存在,就不再重新安装了,即使远程仓库已经有了一个新版本,也是如此。

如果你希望,一个模块不管是否安装过,npm 都要强制重新安装,可以使用-f--force参数,即npm install <packageName> --force

package.json

在一个 Node 项目中, 我们通常使用 package.json 文件来帮助我们管理项目中对第三方库的依赖,同时这个文件中还记录一些项目相关的信息。

一个参考的package.json 文件格式:
{
  "name": "hexo-site",
  "version": "0.0.0",
  "private": true,
  "hexo": {
    "version": "3.2.2"
  },
  "dependencies": {
    "hexo": "^3.2.0",
    "hexo-deployer-git": "^0.2.0",
    "hexo-generator-archive": "^0.1.4",
    "hexo-generator-baidu-sitemap": "^0.1.2",
    "hexo-generator-category": "^0.1.3",
    "hexo-generator-index": "^0.2.0",
    "hexo-generator-json-content": "^3.0.1",
    "hexo-generator-sitemap": "^1.1.2",
    "hexo-generator-tag": "^0.2.0",
    "hexo-renderer-ejs": "^0.2.0",
    "hexo-renderer-marked": "^0.2.10",
    "hexo-renderer-stylus": "^0.3.1",
    "hexo-server": "^0.2.0"
  }
}

具体来说,在package.json中,包括dependenciesdevDependenciesoptionalDependencies三个用于管理项目对第三方库依赖的项。

dependencies 项纪录了在生产环境下,本项目依赖的第三方库,devDependencies项纪录了在开发环境下,本项目依赖的第三方库。optionalDependencies项纪录了可选的依赖库。

下载依赖库

在开发过程中,若需要增加一个库依赖,可以依靠npm install {package name}。而且,建议添加-savesave-dev参数,可以省掉你手动将这个依赖项增加到package.json文件的步骤。

# 下载所有被列举在`package.json`的`dependencies`中的项
$ npm install

# 将package.json中devdependencies部分的所有项下载到node_modules文件夹下
$ npm install --save-dev

# 仅下载指定依赖项
$ npm install {package name}

# 下载当前指定依赖项,并自动把模块和版本号添加到 dependencies 部分
$ npm install {package name} --save

# 下载当前指定依赖项,并自动把模块和版本号添加到 devdependencies 部分
$ npm install {package name} --save-dev

# 下载当前指定依赖项,并自动把模块和版本号添加到 optionalDependencies 部分
$ npm install {package name} --save-optional

# 下载指定版本的依赖项
$ npm install <name>@<version>

Best Practise(使用 npm init)

通常使用 Git 作为对本项目的版本管理工具时,需要将node_modules/项添加到.gitignore中(即告诉Git,你不需要跟跟踪 node_modules 文件夹中任何的变化)。

(我曾因为未添加node_modules/,而导致提交 commit 时,会把整个node_modules文件夹中的所有文件都 push 到服务器上,最终导致 commit一直失败!!)

如果 developer 去到了新的开发环境,或者有新的人员加入这个项目,只要使用npm init,npm 就会根据 package.json 中的括dependenciesdevDependencies记录,把本项目依赖的所有第三方库都下载下来(保存在node_modules文件夹中),这样就保证了项目中依赖资源的正确性和稳定性。

文件中声明使用的第三方库

若某个文件依赖某个第三方库,除了执行npm install外,还需要在该文件的头部,声明对应的依赖库依赖(类似Java的import)。

// 引入了一个http库
var http = require("http");
// 引入任意你想使用的库
var sth = require("library name");

常用npm命令

# 列出已安装模块
$ npm list         

# 更新已安装的某个模块或所有模块(不提供packageName )。它会先到远程仓库查询最新版本,然后查询本地版本。如果本地版本不存在,或者远程版本较新,就会安装。
npm update <packageName>        

# 显示版本,检查npm 是否正确安装。
$ npm -v          

# 安装express模块
$ npm install express  

# 全局安装express模块
$ npm install -g express  

# 列出已安装模块
$ npm list         

# 显示模块详情
$ npm show express     

# 升级当前目录下的项目的所有模块
$ npm update        

# 升级当前目录下的项目的指定模块
$ npm update express   

# 升级全局安装的express模块
$ npm update -g express  

# 删除指定的模块
$ npm uninstall express  

npm script

npm 允许在package.json文件里面,使用scripts字段定义脚本命令

{
	...
  "scripts": {
    "build": "node build.js"
  }
}

上面代码是package.json文件的一个片段,里面的scripts字段是一个对象。它的每一个属性,对应一段脚本。比如,build命令对应的脚本是node build.js。命令行下使用npm run命令,就可以执行这段脚本。

npm run build等同于执行node build.js

这里,其实还可以简化npm run build -> npm build,即,执行npm build和上面两条都是等同的。

这些定义在package.json里面的脚本,就称为 npm 脚本。它的优点很多。

Node.js 与 npm升级

请参考https://swsmile.info/2017/04/09/Node.js%20%E4%B8%8E%20npm%E5%8D%87%E7%BA%A7/。

参考