模块加载机制
优先从缓存中加载
- 当一个模块初次被
require
的时候,会执行模块中的代码,当第二次加载相同模块的时候,会优先从缓存中查找,看有没有这样的一个模块! - 好处:提高模块的加载速度;不需要每次都重新执行并加载模块!
核心模块的加载机制
- 先查找缓存;如果缓存中没有,再去加载核心模块;
用户模块的加载机制
-
先查找缓存;
-
如果缓存中没有则尝试加载用户模块;
-
如果在加载用户模块时候省略了后缀名,则:
- 首先,严格按照指定的名称去查找
- 其次,尝试加载后缀名是 .js 的文件
- 如果没有.js的文件,则尝试加载 .json 结尾的文件
- 如果没有 .json 的文件,则尝试加载 .node 结尾的文件
- 查找规则:index -> index.js -> index.json -> index.node
第三方模块的加载机制【了解】
- 先在项目根目录中查找
node_modules
文件夹 - 在
node_modules
文件夹下,查找模块相关的文件夹 - 在对应的文件夹下,查找
package.json
的文件 - 查找
package.json
文件中的main
属性(指定了模块的入口文件) - 如果找到了
main
属性,同时,main
属性指定的文件路径存在,那么尝试加载指定的文件模块 - 加入没有
main
属性,或者main
属性对应的文件不存在,或者没有package.json
,那么会依次尝试加载index.js
,index.json
,index.node
; - 如果没有
index
相关的文件,或者没有指定模块对应文件夹,或者,当前项目根目录中没有node_modules
文件夹,则向上一层目录中查找node_modules
,查找规则同上! - 最后,如果在项目所在磁盘的盘符根目录中,还找不到对应模块,则报错:
cannot find module
1. express中获取参数的几种形式
项目
- 初始化项目:
npm init -y
- 安装express服务器:
npm install express -S
index.js
const express = require('express')
const bodyParser = require('body-parser')
const app = express()
// 注册 body-parser 中间件,来解析Post提交过来的表单数据
app.use(bodyParser.urlencoded({ extended: false }))
/*
监听客户端的 get 请求
http://127.0.0.1:3001/user?id=10&name=zs
*/
app.get('/user', (req, res) => {
// 服务器,可以直接通过 req.query 属性,获取到客户端提交到服务器的 查询参数
console.log(req.query)
res.send('ok')
})
/*
URL 规则中的 : 表示参数项
监听客户端的 get 请求:http://127.0.0.1:3001/user/10/zs
*/
app.get('/user/:id/:name', (req, res) => {
console.log(req.params)
res.send('ok')
})
// 监听客户端 post 请求:从post表单中获取提交的数据
app.post('/user', (req, res) => {
// 注意:如果在项目中,想要通过 req.body 获取客户端提交的表单数据,
// 必须 先注册 body-parser 中间件才可以!
console.log(req.body)
res.send('ok')
})
app.listen(3001, () => {
console.log('server running at http://127.0.0.1:3001')
})
- 获取
http://127.0.0.1:3001/user?id=10&name=zs
中的查询参数:- 直接使用
req.query
获取参数即可; - 注意:URL 地址栏中通过
查询字符串
传递的参数,express 框架会直接解析,大家只需要使用req.query
直接获取 URL 中 查询字符串的参数;
- 直接使用
- 从URL地址中获取路径参数:
- 假设后台的路由是
app.get('/user/:id/:name', (req, res) => {})
- 假设客户端浏览器请求的URL地址为:
http://127.0.0.1:3001/user/10/zs
- 直接使用
req.params
可以获取URL地址中传递过来的参数;
- 假设后台的路由是
- 从post表单中获取提交的数据:
- 借助于
body-parser
来解析表单数据 - 安装:
npm i body-parser -S
- 导入:
const bodyParser = require('body-parser')
- 注册中间件:
app.use(bodyParser.urlencoded({ extended: false }))
- 使用解析的数据:
req.body
来访问解析出来的数据
- 借助于
2. Web 开发模式
2.1 混合模式(传统开发模式)
- 以后端程序员为主,基本上不需要前端程序员,或者,前端程序员只负责画页面、美化样式、写JS特效,前端程序员不需要进行数据的交互;
- 这种开发模式,在早些年比较常见;
- 传统开发模式下,用的最多的是 Jquery + 模板引擎 + Bootstrap
- 后端页面 .php .jsp .aspx .cshtml
2.2 前后端分离(趋势)
- 后端负责操作数据库、给前端暴露接口
- 前后端分离的好处:保证了各个岗位的职责单一;
- 前端负责调用接口,渲染页面、前端就可以使用一些流行的前端框架 Vue, React, Angular
3. JSONP 和 CORS 的区别
- JSONP的原理:动态创建script标签;
- JSONP发送的不是Ajax请求
- 不支持 Post 请求;
- CORS中文意思是
跨域资源共享
,需要服务器端进行CORS
配置;- CORS 发送的是真正的Ajax请求
- CORS 支持Ajax的跨域
- 如果要启用 CORS 跨域资源共享,关键在于 服务器端,只要 服务器支持CORS跨域资源共享,则 浏览器肯定能够正常访问 这种 CORS 接口;而且,客户端在 发送 Ajax的时候,就像发送普通AJax一样,没有任何代码上的变化;
- 对于Node来说,如果想要开启 CORS 跨域通信,只需要安装
cors
的模块即可;