NodeJS是什么?
Node.js是一个基于Crome V8引擎的JavaScript运行时,主要用于web服务器。(Node.js is built on top of the Google Chrome V8 JavaScript engine, and it's mainly used to create web servers)——NodeJs官方文档
广义理解
- 一个
JavaScript
运行时。Chrome V8
是Js
在浏览器中的运行时,NodeJs
是Js
在服务器中的运行时NodeJS
不是一名语言是运行时
- 内置开发包管理工具:
npm
(也可以使用yarn
、pnmp
等其他的包管理工具) - 提供内置的开发包
- 代码执行为异步非阻塞式(传统的代码执行为阻塞式)
- 代码组织规范:
module
:exports
,require
(export
,import
)- 因为是
NodeJS
的一个运行时,其定义了代码与代码间的一种组织,而这里的代码就是靠module
组织起来的 module
与module
之间可以使用exports
来对外暴露其自身的函数- 使用
require
来使用其他module
暴露给自己的函数
- 因为是
package
:package.json
,(dependecy
)- 所有的
module
在一个目录里面时通过package.json
文件来进行管理的
- 所有的
NodeJS
提供了npmjs.com
来共享第三方包的生态
进入NodeJS的交互模式
在控制台输入 node
进入交互模式,此时可以输入对应的 js
代码运行。
实际上与浏览器中的控制台差不多,但是在一些情况下有区别
Js
是一种脚本语言,无需实现编译成机器码,但是需要运行时(运行环境)
浏览器内置运行时与NodeJS
运行时的区别
-
变量赋值
1
var a = 1;
-
在浏览器中
1
window.a
-
在
NodeJS
中1
global.a
-
开发模式
新建文件index.js
|
|
在其建立的目录下使用命令:node index.js
或者node .
建立自己的module
并使用
新建文件modulex.js
|
|
引入刚才建立的modulex
使用require
,对刚才新建的index.js
进行修改
|
|
|
|
也可以向外暴露函数
|
|
使用
|
|
|
|
备注:
- 因为本身只有一种暴露方式所以
modulex.js
文件中的module
是可以不用写的(执行效果是一眼的)
|
|
使用NodeJS内置包模块(fs
)
以读取文件为案例:
- 同步阻塞
|
|
|
|
- 异步非阻塞
|
|
|
|
可以看到异步非阻塞的情况下是先输出Done
字眼的,这说明执行文件读取这步并没有阻塞代码的执行。
-
Promise
- 可以通过
async
和await
来达到阻塞代码的效果
1 2 3 4 5 6 7 8 9 10 11 12
/** * index.js */ const { readFile } = require('fs').promises; async function rdFile() { console.log('reading ...'); const txt = await readFile('./modulex.js', 'utf-8'); console.log(txt); console.log('done'); } rdFile();
1 2 3 4 5 6 7 8 9 10 11
> node index.js reading ... /** * modulex.js */ var a = 1; // 向外暴露函数 module.exports = function(x) { console.log(`输入的参数为${x}`); } done
promise
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/** * index.js */ const { readFile } = require('fs').promises; async function rdFile() { console.log('reading ...'); const prom = readFile('./modulex.js', 'utf-8'); prom.then(rslt => { console.log(rslt); }) console.log(prom); console.log('done'); } rdFile();
1 2 3 4 5 6 7 8 9 10 11 12
> node index.js reading ... Promise { <pending> } done /** * modulex.js */ var a = 1; // 向外暴露函数 module.exports = function(x) { console.log(`输入的参数为${x}`); }
-
上面这种情况
rdFile
返回的是promise
-
返回
promise
之后程序不会阻塞,而是背地里回去后台读取文件 -
程序就会先后执行
console.log(prom);
和console.log('done');
这两句 -
文件读取完成才执行
then
方法中的回调函数,输出文件的内容
- 可以通过
使用npm
平台与第三方包模块
使用npm init
让当前目录具有包管理能力,这样会在目录下新建一个package.json
|
|
- 安装单独的依赖包时,
npm install <packageName>
安装express
|
|
补充(一些参数的说明):
-
npm install
和npm i
等价,都是安装package.json
文件中的依赖包。 -
--save
等同于-S
(常用,可保存在package.json
文件中)-S
,--save
安装包信息将加入到dependencies
(生产阶段的依赖,也就是项目运行时的依赖,就是程序上线后仍然需要依赖) -
--save-dev
等同于-D
-D
,--save-dev
安装包信息将加入到devDependencies
(开发阶段的依赖,就是我们在开发过程中需要的依赖,只在开发阶段起作用。) -
–-only=dev
:添加--only=dev
安装项目所需依赖时,只有devDependencies
字段中的依赖包会被安装,dependencies
字段中的依赖包不会被安装。 -
--production
:添加--production
安装项目所需的依赖时,只有dependencies
字段中的依赖包会被安装,devDependencies
中的依赖包不会被安装。
index.js
|
|
效果: