什么是Node.js?
-
Node.js是一门后端语言
-
基于Chrome v8引擎的js运行环境;
除此之外:还有其他的引擎: 单片机、actionscript -
Node.js有两大特征
- 事件驱动
- 事件的定义(发布)
- 事件的触发(订阅)
- 非阻塞式 I/O 模型
- 非阻塞 : 执行一个任务时,不需要等待这个任务执行完成,就可以去执行其他任务
- I/O: 磁盘文件操作 / 数据库数据操作
- 事件驱动
-
总结:
- 问题: 非阻塞,但是js是单线程,要想实现非阻塞,必须将任务放到任务队列,任务队列如何放?
- 解决: js中异步操作
- js中如何实现异步操作
1. 回调函数
2. Promise
3. gengator函数
4. async函数
5. Node.js自带的 nextTick setImmediate
6. 别人封装的 async.js 库
Node.js的包管理器
-
NPM: 全球最大的开源生态系统( 国外的 )
-
cnpm 淘宝镜像( 国内的 )
-
yarn 流行
-
npm && yarn 全部要配置国内镜像 ( 百度关键字: yarn国内镜像 )
Node.js的版本问题
- Node.js有两个版本, 一个是测试版, 一个是稳定版,造成;两个版本的原因是: 有两个团队
- 业内规定:
- 版本的单数是: 测试版 bate版本
- 版本的偶数是: 稳定版
Node.js 安装
安装方式有两种:
-
官网下载镜像直接安装 ( 只能使用一个版本 )
-
使用 nvm 来安装 ( nvm可以管理多个Node.js版本 )
- nvm有坑: nvm安装有难度
- nvm安装: https://github.com/coreybutler/nvm-windows/releases (下载第三个 nvm-setup.zip)
- nvm安装前先卸载本地的Node.js
- 问题: 如果报错 nvm命令没找到, 就是你的系统环境变量没有自动生成, 所以你要手动配置
- https://blog.youkuaiyun.com/qq_27626333/article/details/77857223
-
注意: Node.js安装的最低版本至少要8.9以上
Node.js使用
1. 命令终端
- Node.js的全局对象是 global ; javascript的全局对象是 window
- 直接在命令终端中输入node,然后回车,就会出现 ‘>’ 标识,然后就可以写js语法了
- 命令终端退出: Ctrl + c 两次
2. 文件型使用
-
命令行键盘 tab 键 自动补全文件名称
-
执行文件/运行文件:
$ node 文件名称.js
-
自动监听node.js文件/ 自动刷新工具
- nodemon
- supervisor
-
自动监听工具的安装
- npm:
$ npm install nodemon -g
$ npm install supervisor -g
- cnpm:
$ cnpm install nodemon -g
$ cnpm install supervisor -g
- yarn:
$ yarn add nodemon global
$ yarn add supervisor global
- npm:
Node.js服务器
Node.js服务器有两种
- web服务器( 静态服务器 )
- api服务器( 动态服务器 ) 数据接口
Node.js web服务器
C:\Ruby23-x64\bin;
%SystemRoot%\system32;
%SystemRoot%;
%SystemRoot%\System32\Wbem;
%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;
C:\Program Files\Git\cmd;
%NVM_HOME%;
%NVM_SYMLINK%;
C:\Ruby23-x64\bin;%SystemRoot%\system32;
%SystemRoot%;%SystemRoot%\System32\Wbem;
%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;
C:\Program Files\Git\cmd;
用Node.js创建一个静态服务器,然后将项目部署在这个服务器中
源代码:
var http = require( 'http' );
var port = 8080 ;
var hostname = '127.0.0.1'
var path = require( 'path' ) // 磁盘路径处理的模块
var fs = require( 'fs' ) // 操作文件、目录的模块
var url = require( 'url' ) // 处理url
var server = http.createServer( function ( request, response ) {
var staticPath = path.join( __dirname,'static' )
var urlObj = url.parse( request.url )
/* Url {
protocol: null,
slashes: null,
auth: null,
host: null,
port: null,
hostname: null,
hash: null,
search: null,
query: null,
pathname: '/static/css/index.css',
path: '/static/css/index.css',
href: '/static/css/index.css' */
if( urlObj.pathname === '/'){
urlObj.pathname += 'index.html'
}
console.log( urlObj.pathname )
// fs.readFile(路径,字符编码,错误优先的回调函数)
var filePath = path.join( staticPath, urlObj.pathname )
fs.readFile( filePath,'binary',function( error,filecontent ) {
if ( error ){
throw error
}else {
response.write( filecontent, 'binary' )
response.end()
}
})
})
server.listen( port , hostname , function () {
console.log( `The server is runing: http://${ hostname }:${ port }` )
})