NodeJS(预备知识)

一、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的版本:

>npm -v
6.10.3               // 新版本号

  当然,作为一个包管理工具,会经常被用来下载第三方库,那么下载速度就是不得不考虑的一个指标了,作为具有同样功能的淘宝镜像cnpm在这方面优于node自带的的npm,所以可以用cnpm来代替npm(直接替换就可以了),在终端中输入如下指令(-g代表了全局安装):

>npm install -g cnpm --registry=https://registry.npm.taobao.org

  然后等待安装成功即可。然后同样通过来查看版本来验证是否安装成功

>cnpm -v

查看cnpm版本
  出现版本提示表示安装成功。

三、服务器

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

流程如下图(该图引自W3Cschool)所示:
Node模块系统家在流程图

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
}
发布了24 篇原创文章 · 获赞 43 · 访问量 9809

猜你喜欢

转载自blog.csdn.net/weixin_37844113/article/details/99681097