Ajax出现之前,前端页面都是由前后端混合开发的,也就是混编语言,例如ASPHTML+VBScript)、JSPHTML+JAVA)、PHPHTML+PHP)…

后端项目的逻辑可以安装以下进行分层:

  • WEB层(Controller):用于用户的权限校验、封装、用户提示等
  • 服务层或业务逻辑层(Server):处理后端集体的业务
  • DAO层(Data Access Object):数据录入数据库
  • 持久层:也就是数据库(关系型:mySQLOracleDB2)( 非关系型:MongDB

模块化规范

CommonJSNodeJS模块化的规范,它不是任何一种代码或编程语言,它规范如下内容(简单):

  • 一个文件就是一个模块(类似一个函数内部),拥有自己单独的作用域
  • 普通方式定义的变量、函数都要在模块内,也就是文件内
  • 使用require()加载模块
  • 使用exports或者module.exports导出模块

NodeJS中没有Window全局对象,而是global对象。

  1. var a = 10;
  2. // 相当于
  3. window.a = 10;

NodeJS中变量声明不会添加到global对象上,这是因为变量声明只存在于文件模块内(类似在函数内声明了变量)。

  1. var a = 10;
  2. console.log(global.a); // undefined

关于NodeJS相关的命令:
Node.js 中文文档 | Node.js 中文网

require()

NodeJS中的加载模块分为两类:
1、Node内置模块(也称为「核心模块」),例如:httpfs

  1. require("fs");

加载Node内置模块时不需要具体路径,直接写模块名称即可,因为Node模块在编译的过程中已经被加载到内存当中,所以可以忽略路径名。 :::warning ⚠️ 注意
当不加路径的时候,Node会把文件当作Node的模块,如require("index")(实际路径在./src/index.js)时会抛出错误。 ::: 2、开发者自己写的模块

  1. require("./index");
  2. // /表示根目录(绝对路径)
  3. // ./ 表示当前目录(相对路径)
  4. // ../ 表示上一级目录(相对路径)

require()加载的模块没有后缀名时(如require("./index"))是有一套查找机制的:

  • 先补全.js
  • 再补全.json
  • 再补全.node

如果以上补全以上三个后缀名都都无法找到文件就会抛出异常。

require()的特征:
1、具有缓存性

  1. require("./index.js");
  2. require("./index.js");
  3. // 使用 node main.js 运行文件的时候只会打印一次 "this is index.js"
  1. console.log("this is index.js")

2、require()引入一个模块的时候类似于调用一个函数的执行,函数内部的变量是外部是无法拿到的,所以需要使用export将模块数据进行导出(这有点类似函数中的return
3、require()引入的是export导出的值
4、循环引用的时候,只会输出已加载的部分,还没执行的部分不会输出
结果是 "a" "bb"

module.export

require()对应的是module.exports导出,同时也可以使用exports直接导出,exportsmodule.exports对象的引用,相当于快捷方式可以少写一个单词。

  1. exports.a = 200;
  2. module.exports.b = 300;

:::warning ⚠️ 注意
不能使用exports直接赋值为一个对象,这会破坏exportsmodule.exports的引用!!! :::

  1. // 这里赋值后不再指向 module.exports,所以这样的情况下其他文件是无法拿到 exports 导出的值
  2. exports = { a:10 };
  3. module.exports = { a:10 }