文章目录
一、NodeJs简介
NodeJs是运行在服务端的JavaScript。它是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。
1.1 作用
写后台管理程序(数据服务,文件服务,web服务等)
1.2 优缺点
- 优势
- 性能高(大约是php的86倍)
- 对于前端人员门槛低(JS语法),使用方便,比较流行
- 缺点
- 服务器提供的相对较少
- 目前学习资料少,对程序员的要求较高
1.3 注意点
- 语法和ECMAScript一致
- 完美支持ES6,所以在node环境中可以使用ES6的所有语法
1.4 运行
1.4.1 DOS
- Win+R → cmd → cd 要运行的js文件所在目录 → node js文件(有无后缀名皆可,因为会自动匹配js文件)
- 当前目录 → 右键 → git bash → node 文件名
- WebStrom → Terminal(编辑器终端,进入后操作同DOS) || Run(真实服务器环境)
- VsCode → 终端
…
1.4.2 Linux/Centos(git):
终端 → cd 目录 → js文件(有无后缀名皆可,因为会自动匹配js文件)
1.4.3 Node命令行
dos → node → 编写+运行
【注】可用来测试API的可用度
二、NPM
2.1 简介
NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种:
- 允许用户从NPM服务器下载别人编写的第三方包到本地使用。
- 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
- 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。
2.2 安装(Windows)
由于新版的NodJjs已经集成了npm,所以之前npm也一并安装好了。同样可以通过在终端输入如下指令来测试是否成功安装。命令如下,
>npm -v
5.6.0 // 出现版本号代表成功
如果要升级npm的版本,可以通过如下命令:
>npm install npm -g
显示成功,然后再查看npm的版本:
>npm -v
6.10.3 // 新版本号
当然,作为一个包管理工具,会经常被用来下载第三方库,那么下载速度就是不得不考虑的一个指标了,作为具有同样功能的淘宝镜像cnpm在这方面优于node自带的的npm,所以可以用cnpm来代替npm(直接替换就可以了),在终端中输入如下指令(-g代表了全局安装):
>npm install -g cnpm --registry=https://registry.npm.taobao.org
然后等待安装成功即可。然后同样通过来查看版本来验证是否安装成功
>cnpm -v
出现版本提示表示安装成功。
三、服务器
3.1 简介
服务器指的是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。
3.2 分类
在网络环境下,根据服务器提供的服务类型不同,分为文件服务器、数据库服务器、应用程序服务器以及WEB服务器等。
3.3 开发模式
3.3.1 前后端耦合(大后端)
前端HTML页面通过Ajax调用后端的RestFul API并使用Json数据进行交互
用户 → 地址栏(http[s]请求) → web服务器(收到) → nodejs处理请求(返回静态、动态) → 请求数据库服务(返回结果) → nodejs(接收) → 渲染页面 → 浏览器(接收页面,完成最终渲染)
3.3.2 前后端分离(大前端)
前端写完的HTML页面交给后端,后端负责渲染数据,前后端相互调整的方式
前端 → http[s]请求 → web服务器(收到) → nodejs处理请求(返回静态、动态) → 请求数据库服务(返回结果) → nodejs(接收) → 返回给前端(渲染) → 浏览器(接收页面,完成最终渲染)
四、CommonJS
4.1 简介
CommonJS是服务器端语言模块化的规范,Node.js采用了这个规范。就好比ECMA是一个规范,然后原生JS采用了这个规范。根据CommonJS规范,一个单独的文件就是一个模块。每一个模块都是一个单独的作用域,也就是说,在一个文件定义的变量(还包括函数和类),都是私有的,对其他文件是不可见的。它不支持es6的模块化管理方式,但支持所有es6+语法
4.2 关键词
- 导出
- 单次导出(module.exports)导出为函数 || 类 || 对象
- 批量导出(exports)导出为属性
- 导入
- 不指定路径:require(‘模块名’)
流程:系统模块 → 再从项目环境找node_modules || bower_components (依赖模块) → not found - 指定路径:require(./utils)
流程:指定路径 → not found
- 不指定路径:require(‘模块名’)
流程如下图(该图引自W3Cschool)所示:
4.3 实例
4.3.1 exports
模块:a.js
let a=12;
let b='bmw';
let c=function(){console.log('函数')}
//批量输出
exports.a = a;
exports.b = b;
exports.c = c;
引入文件:1.js
let modA = require('./mod/a');
console.log(modA); // { a: 12, b: 'bmw', c: [Function: c] }
modA.c() // 函数
总结:引入expports导出的模块时,变量和函数都被组合到了一个对象中
4.3.2 module.exports
模块:b.js
let a=12;
let b='bmw';
let c=function(){console.log('函数')}
module.exports = {
a:a,
b:b,
c:c
}
//
module.exports = {
aa:a,
bb:b,
cc:c
}
引入文件:2.js
let modB = require('./mod/b');
console.log(modB); // { aa: 12, bb: 'bmw', cc: [Function: c] }
modB.cc() // 函数
总结:默认输出,只能输出一次,前一个会被下一个覆盖
4.3.2 module.exports + exports
模块:c.js
let a=12;
let b='bmw';
let c=function(){console.log('函数')}
module.exports = {
a:a,
b:b
}
exports.c = c;
引入的文件:3.js
let modC = require('./mod/c');
console.log(modC); //{ a: 12, b: 'bmw' }
总结:默认输出(modeul.exports)的权重最高
【注】如果key和value的值相同,那么可以简写为那个相同的值,比如:
module.exports = {
a:a,
b:b,
c:c
}
====等价于====
module.exports = {
a,
b,
c
}