在Ajax
出现之前,前端页面都是由前后端混合开发的,也就是混编语言,例如ASP
(HTML
+VBScript
)、JSP
(HTML
+JAVA
)、PHP
(HTML
+PHP
)…
后端项目的逻辑可以安装以下进行分层:
WEB
层(Controller
):用于用户的权限校验、封装、用户提示等- 服务层或业务逻辑层(
Server
):处理后端集体的业务 DAO
层(Data Access Object
):数据录入数据库- 持久层:也就是数据库(关系型:
mySQL
、Oracle
、DB2
)( 非关系型:MongDB
)
模块化规范
CommonJS
是NodeJS
模块化的规范,它不是任何一种代码或编程语言,它规范如下内容(简单):
- 一个文件就是一个模块(类似一个函数内部),拥有自己单独的作用域
- 普通方式定义的变量、函数都要在模块内,也就是文件内
- 使用
require()
加载模块 - 使用
exports
或者module.exports
导出模块 - …
NodeJS
中没有Window
全局对象,而是global
对象。
var a = 10;
// 相当于
window.a = 10;
NodeJS
中变量声明不会添加到global
对象上,这是因为变量声明只存在于文件模块内(类似在函数内声明了变量)。
var a = 10;
console.log(global.a); // undefined
关于NodeJS
相关的命令:
Node.js 中文文档 | Node.js 中文网
require()
NodeJS
中的加载模块分为两类:
1、Node
内置模块(也称为「核心模块」),例如:http
、fs
等
require("fs");
加载Node
内置模块时不需要具体路径,直接写模块名称即可,因为Node
模块在编译的过程中已经被加载到内存当中,所以可以忽略路径名。
:::warning
⚠️ 注意
当不加路径的时候,Node
会把文件当作Node
的模块,如require("index")
(实际路径在./src/index.js
)时会抛出错误。
:::
2、开发者自己写的模块
require("./index");
// /表示根目录(绝对路径)
// ./ 表示当前目录(相对路径)
// ../ 表示上一级目录(相对路径)
require()
加载的模块没有后缀名时(如require("./index")
)是有一套查找机制的:
- 先补全
.js
- 再补全
.json
- 再补全
.node
如果以上补全以上三个后缀名都都无法找到文件就会抛出异常。
require()
的特征:
1、具有缓存性
require("./index.js");
require("./index.js");
// 使用 node main.js 运行文件的时候只会打印一次 "this is index.js"
console.log("this is index.js")
2、require()
引入一个模块的时候类似于调用一个函数的执行,函数内部的变量是外部是无法拿到的,所以需要使用export
将模块数据进行导出(这有点类似函数中的return
)
3、require()
引入的是export
导出的值
4、循环引用的时候,只会输出已加载的部分,还没执行的部分不会输出
module.export
和require()
对应的是module.exports
导出,同时也可以使用exports
直接导出,exports
是module.exports
对象的引用,相当于快捷方式可以少写一个单词。
exports.a = 200;
module.exports.b = 300;
:::warning
⚠️ 注意
不能使用exports
直接赋值为一个对象,这会破坏exports
和module.exports
的引用!!!
:::
// 这里赋值后不再指向 module.exports,所以这样的情况下其他文件是无法拿到 exports 导出的值
exports = { a:10 };
module.exports = { a:10 }