引入
近两年来,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
中,包括dependencies
、devDependencies
、optionalDependencies
三个用于管理项目对第三方库依赖的项。
dependencies
项纪录了在生产环境下,本项目依赖的第三方库,devDependencies
项纪录了在开发环境下,本项目依赖的第三方库。optionalDependencies
项纪录了可选的依赖库。
下载依赖库
在开发过程中,若需要增加一个库依赖,可以依靠npm install {package name}
。而且,建议添加-save
和save-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 中的括dependencies
和devDependencies
记录,把本项目依赖的所有第三方库都下载下来(保存在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/。
参考
- Web 研发模式的演变 - http://blog.jobbole.com/65509/
- Node.js Wikipedia - https://en.wikipedia.org/wiki/Node.js
- npm Wikipedia - https://en.wikipedia.org/wiki/Npm
- npm 模块安装机制简介 - http://www.ruanyifeng.com/blog/2016/01/npm-install.html
- npm-install - https://docs.npmjs.com/cli/install