在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 }
