The following are just some notes when I learn NodeJS. Most of the contents are taken from others. The references have been listed in the end.
The reason I want to learn it is just because that I need to write codes for my websites…
NodeJS Basics
What is NodeJS?
在了解NodeJS之前,先要了解JS,JS就是JavaScript, 是一种脚本语言(scripting language),它运行在浏览器中。那什么是脚本语言呢? 脚本语言其实也是一种编程语言(programming language). 传统的编程语言是会有这几个步骤的:编写-编译-链接-运行(edit-compile-link-run)。脚本语言与一般的编程语言的区别在于,他们没有编译(compilation)这个过程,而是通过一种解释的形式来运行。通常来讲,编译型的语言会运行得比解释型语言快,因为他们先转化为及其语言,并且编译器只会读和分析一次代码,最后汇总所有的errors出来。但解释型语言则会在每次遇到一个错误的时候都停下来,而非汇总。
扯远了,那JS是一个脚本语言的话,就需要一个解析器才能运行,对于写在HTML页面里的JS,浏览器充当了解析器的角色。而对于需要独立运行的JS,NodeJS就是一个解析器。
任何操作系统下安装NodeJS本质上做的事情都是把NodeJS执行程序复制到一个目录,然后保证这个目录在系统PATH环境变量下,以便终端下可以使用node命令。
安装及运行
安装
在Windows下,在官网上下载好后,直接运行.msi安装文件即可
运行
- 在终端运行:Windows下,cmd进入终端,输入
node
就可以进入交互模式了,及之后的运行环境都是在NodeJS下,想退出的话输入.exit
- 运行JS文件:当要运行大段代码时,在终端编写代码不是很方便,这时就可以先写一个JS文件(以.js结尾储存),然后再运行这个文件,假如JS文件名为”hello.js”, 在命令行输入
node hello.js
就可以运行这个脚本程序了。
模块
- 在编写大型程序时,一般都会将程序模块化,及分成一个一个的子程序。这些子程序在js中就是一个一个的不同的js文件,每个文件就是一个模块,文件路径就是模块名。
- 在编写每个模块时,都有
require
、exports
、module
三个预先定义好的变量可供使用。 - require
- 用于在当前模块中加载和使用别的模块,传入一个模块名,返回一个模块导出对象。
- 模块名可使用相对路径(以./开头),或者是绝对路径(以/或C:之类的盘符开头)。
- 另外,模块名中的.js扩展名可以省略
- e.g.
var foo1 = require('./foo');
,var foo2 = require('./foo.js');
,var foo3 = require('/home/user/foo');
,var foo4 = require('/home/user/foo.js');
都是指导入同一个模块
- exports
- 是当前模块的导出对象,用于导出模块公有方法和属性。
- 别的模块通过require函数使用当前模块时得到的就是当前模块的exports对象。
- module
- 通过
module
对象可以访问到当前模块的一些相关信息,但最多的用途是替换当前模块的导出对象。
- 通过
- 模块初始化: 一个模块中的JS代码仅在模块第一次被使用时执行一次,并在执行过程中初始化模块的导出对象。之后,缓存起来的导出对象被重复利用。简单点,所有模块都只初始化一次。
- 主模块:
- 即 负责调度组成整个程序的其它模块完成工作。
- 通过命令行参数传递给NodeJS以启动程序的模块被称为主模块。
代码的组织和部署
模块路径的解析
我们在写程序时会用到 require
来告诉程序需要用到哪些模块,让你程序就会去找这些模块,找这些模块的过程就叫做路径解析。那怎么去找呢,分两种情况:
- 如果是内置模块,即自带的那种,就不做路径解析
- node_module目录:这是NodeJS定义的一个专门用来存放模块的目录,在加载某个非内置模块时,NodeJS就会去找
node_module
这个文件夹。其实在用Hexo创建静态网页时,你就会发现在你创建的hexo项目下就有个node_modules
文件夹。 - NODE_PATH环境变量:NodeJS允许通过
NODE_PATH
环境变量来指定额外的模块搜索路径。包(Package)
JS模块的基本单位是单个JS文件,但复杂些的模块往往由多个子模块组成。为了便于管理和使用,我们可以把由多个子模块组成的大模块称做包,并把所有子模块放在同一个目录里。
在组成一个包的所有子模块中,需要有一个入口模块,入口模块的导出对象被作为包的导出对象。 - 在其它模块里使用包的时候,需要加载包的入口模块。可以直接使用require加上入口模块名称的路径来加载。但是这样不简洁,要让包使用起来更像是单个模块的话,就将模块的文件名设为
index.js
,这样即使在require路径上不出现index这个名称,程序也会知道这个index.js
就是入口模块。 - 使用
package.json
可以自定义入口模块的文件名和存放位置,即:在包目录下包含一个package.json
文件,并在其中指定入口模块的路径:1
2
3
4{
"name": modulename
"main": "./lib/main.js" # 这里就指定入口模块的路径
}
工程目录
标准如下:1
2
3
4
5
6
7
8
9
10
11- /home/user/workspace/node-echo/ # 工程目录
- bin/ # 存放命令行相关代码
node-echo
+ doc/ # 存放文档
- lib/ # 存放API相关代码
echo.js
- node_modules/ # 存放三方包
+ argv/
+ tests/ # 存放测试用例
package.json # 元数据文件
README.md # 说明文件
关于NPM
NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种:
- 允许用户从NPM服务器下载别人编写的三方包到本地使用。
- 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
- 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。
七天学会NodeJS上在NPM这个讲解上很详细,推荐看一看。
Reference:
http://nqdeng.github.io/7-days-nodejs/
https://www.geeksforgeeks.org/whats-the-difference-between-scripting-and-programming-languages/