---
noteId: "11381ab0ce9211edab7cdf73cea80b84"
tags: []
[toc]
4月1日总结
-
Node.js是什么?
Node.js是基于V8引擎的JS运行环境。
-
Node.js和Express的关系
- Node.js用于构建服务器
- Express是一个Node框架:基于Node平台开发APP这件事变得更容易。同时对Node开发进行了扩展。
Express框架构建App的步骤
第一步:使用npm init
进行初始化
mkdir myapp
cd myapp
npm init --yes
第二步:安装express
npm install express //局部安装
npm install -g express //全局安装
第三步:导入express
New-item app.js
# 打开app.js 输入
const express = require('express')
第四步:构建APP实例
const app = express() //返回运行在node服务器上的app实例对象。
第五步:监听服务器端口3000
app.listen(3000,() => {
'服务器已运行在: http://localhost:3000'
})
第6步:配置路由
//get请求 200成功
app.get('/',(req,res) => {
//res.send()//发送 text/plain||text/html
//res.sendFile() //发送文件内容 application/json
res.render()//渲染视图模版
})
//get请求 301转向
app.get('./about-us',(req,res) => {
res.redirect('./about')//重定向到'./about'请求
})
//get请求 404页面未找到 必须放最后
app.use((req,res) => {
res.status(404).render('404')
})
3月31日知识点
- 日考知识点自己复习
- express的六个方法背写熟练(express入门案例)
- EJS是什么
3月31日
express是什么
- express是Node.js服务器的框架。
- express是一个Node.js的模块。
express()
定义
- Express()是该框架的核心函数。
-
express()
用于创建一个APP(Node.js + Express)。 -
express()
函数是一个顶级函数。
语法
const express = require('express')//引入模块
const app = express()//暴露函数 成为顶级函数
express()的方法
- express.json()
- express.static()
- express.Router()
- express.urlencoded()
返回值
示例
app.get()
定义
app.get()
方法通过回调函数处理GET请求。
官方:通过回调函数把请求路由到指定路径。
语法
app.get(path,callback)
app.get('请求地址',回调函数) //=> 中间件函数(勾子函数)
app.get('/', (req, res) => {
console.log(req) //req就是Node.js的request对象
console.log(res)//res就是Node.js的response对象
})
返回值
示例
app.use()
定义
app.use()
在指定路径上挂载中间件函数。
语法
app.use([path,] callback [, callback...])
app.use('路径', 回调函数)
app.use('/about',() => {})
app.use(() => {}) //不写路径,那意味着所有路径都会执行回调
返回值
示例
app.listen()
定义
app.listen()
用于为app绑定监听,监听主机端口是否有请求进来。此方法与 Node 的 http.Server.listen() 相同。
语法
app.listen([port[, host[, backlog]]][, callback])
app.listen(端口号,主机名,回调函数)
返回值
示例
res.sendFile()
定义
按照指定路径发送响应数据(作为响应数据)。
- 根据文件扩展名设置 Content-Type 响应 HTTP 标头字段。
- 除非在选项对象中设置了根选项,否则路径必须是文件的绝对路径。
语法
res.sendFile(path [, options] [, fn])
res.sendFile('路径' {选项对象},回调函数)
- path必须是一个绝对路径
- path如果是一个相对路径,那么你必须在选项对象中设置根选项。
返回值
示例
options
定义
options
就是选项对象。
- 它是一个对象
- 对象里存储的是一些属性参数。
{
path:'',
chaset: 'utf-8'
}
res.status()
定义
设置响应的 HTTP 状态码。支持链式调用
语法
res.status(403).end()
res.status(400).send('Bad Request')
res.status(400).sendFile('/absolute/path/404.png')
返回值
返回响应对象。
示例
3月31日 ejs
ejs是什么
- ejs是 Embedded JavaScript templating的缩写,
- ejs的意思:嵌入js的HTML模版(不是嵌入到
<script>
里)。 - ejs是面向服务端的
- ejs是在服务端把js嵌入到html页面里
- 服务端解析ejs语法 => 翻译成html
- 把编译后的html返给浏览器端
- ejs实现的功能类似于php实现的功能:动态渲染数据到HTML页面里。
- JS是面向浏览器端的脚本语言。
- PHP是面向服务端的脚本语言。
- 为什么能够解析PHP,因为服务端安装了PHP软件
//ejs代码
<ul>
<% users.forEach(function(user){ %>
<%- include('user/show', {user: user}); %>
<% }); %>
</ul>
app.set()
定义
app.set()
方法用于:1.存储自定义值 2.配置服务器行为。
服务器行为有些特殊的字段,用于配置服务器行为:
res.render()
定义
render()
方法用于编译ejs模版,把编译后的html代码发送给客户端。
语法
res.render(view [, locals] [, callback])
res.render(视图,{选项},回调函数)
选项对象:向视图传递变量
EJS的语法
-
<%
嵌入脚本的开始 控制代码流 -
%>
嵌入脚本的结束 -
<%=
出计算值 -
<%-
直接输出
3月31日:nodemon
3月30日
http模块
- http模块是Node的内置模块。
- http模块用于构建服务器。
1http.createServer()
定义
用于创建一个Node服务器。主要做了两件事:
- 处理请求
- 处理响应
语法
http.createServer({选项对象},监听函数)
选项对象:可选。是一个object,通过选项对象,传入一些参数。
监听函数:是一个回调函数。当用户请求从端口进来后,该函数立刻被调用。
- Request对象:请求对象
- 请求对象:包含与请求有关信息。
- Response对象:响应对象
- 响应对象:包含与响应有关的信息。
返回值
createServer()
方法返回一个Server对象。
示例:
2server.listen()
定义
用于监听服务器端口。
语法
server.listen()
server.listen([port[,host][,callback])
server.listen(端口,主机名,回调函数)
- 端口: 数值
- 主机名:字符串
- 连接数:数值(最大511)
- 回调函数:function
返回值
返回服务器对象
示例
3res.setHeader()
定义
用于设置响应头信息。特点:
- 只能设置一个值
- 多次执行
- 优先级低于
res.writeHead()
语法
res.setHeader(name, value)
res.setHeader(响应头属性名, 对应的值)
返回值
无
示例
res.setHeader("Content-Type","text/html")
res.setHeader("Content-Type","text/plain")
res.setHeader("Content-Type", "application/json")
4res.write()
定义
write()
方法用于设置响应数据。
语法
response.write(chunk[, encoding][, callback]);
response.write(数据[,字符编码][, 回调函数]);
返回值
布尔值
示例
5res.writeHead()
定义
用于设置响应头信息。特点:
- 设置多个值
- 只能执行一次
- 优先级高于
res.setHeader()
语法
res.writeHead(statusCode[, statusMessage][, headers]);
res.writeHead(状态码,'状态信息',{响应头});
返回值
返回一个响应对象。以便进行链式调用。
示例
6res.end()
定义
end()
用于通知服务器响应结束。该方法在响应时必须调用。
语法
response.end([data[, encoding]][, callback])
res.end('数据','字符编码',回调函数)
返回值
返回this
示例
读取文件内容
const http = require('node:http')
const fs = require('fs')
const server = http.createServer((req,res) => {
// console.log(res);//响应对象[ServerResponse]
// console.log(req);//请求对象[inComingMessage]
console.log(req.url);
//设置响应头的数据类型
// res.setHeader('Content-Type', 'text/html;charset=utf-8')
// res.write('<h1>你好世界</h1>')
// res.write('<h2>你好中国</h2>')
// res.end()
//读取index.html内容作为响应数据
res.setHeader('Content-Type', 'text/html;charset=utf-8')
fs.readFile('./views/index.html',(err,data) => {
if(err){
console.log(err);
res.end()
} else {
res.end(data)//把数据写在这里
}
})
})
server.listen(3000,'localhost',511,() => {
console.log('服务器已经运行在http://localhost:3000');
})
添加路由
const http = require('node:http')
const fs = require('fs')
const server = http.createServer((req,res) => {
console.log(req.url);
res.setHeader('Content-Type', 'text/html;charset=utf-8')
//添加路由
//条件判断 path = './views/index.html'
// fs.readFile('./views/index.html',(err,data) => {
// fs.readFile('./views/about.html',(err,data) => {
fs.readFile('./views/404.html',(err,data) => {
if(err){
console.log(err);
res.end()
} else {
res.end(data)//把数据写在这里
}
})
})
server.listen(3000,'localhost',511,() => {
console.log('服务器已经运行在http://localhost:3000');
})
3月30日下午
熟练掌握node.js路由的原生写法
const http = require('node:http')
const fs = require('fs')
const server = http.createServer((req, res) => {
console.log(req.url);
res.setHeader('Content-Type', 'text/html;charset=utf-8')
//////////////添加路由:router/////////////////
//条件判断 path = './views/index.html'
let path = './views/'
switch (req.url) {
case '/':
path += 'index.html'
res.statusCode = 200
break
case '/about':
path += 'about.html'
res.statusCode = 200
break
case '/about-me':
res.setHeader('Location', '/about')
res.statusCode = 301
break
default:
path += '404.html'
res.statusCode = 404
}
// fs.readFile('./views/index.html',(err,data) => {
// fs.readFile('./views/about.html',(err,data) => {
fs.readFile(path, (err, data) => {
if (err) {
console.log(err);
res.end()
} else {
res.end(data)//把数据写在这里
}
})
})
server.listen(3000, 'localhost', 511, () => {
console.log('服务器已经运行在http://localhost:3000');
})
Npm install
语法
npm install module-name
npm install -g module-name # -g:全局安装
npm i module-name # npm i是npm install的别名
npm install module-name --save
npm install module-name --not--save
npm install module-name --save-dev
express写路由
const express = require('express')
const app = express()
app.get('/', function (req, res) {
// res.send('Hello World')
res.sendFile('./views/index.html',{root:__dirname})
})
app.get('/about', function (req, res) {
res.sendFile('./views/about.html',{root:__dirname})
})
app.get('/about-me', function (req, res) {
res.redirect('/about')
})
//404 page
app.use((req,res) => {
res.status(404).sendFile('./views/404.html',{root:__dirname})
})
app.listen(3000)
3月30日日考题
__dirname是什么: 1.全局变量 2.当前目录名
__filename是什么 1.全局变量 2.当前文件名
path模块的用途是什么? 处理路径
如何把一个字符串路径转成对象?path.parse()
如何提取当前js文件的文件名?path.basename(__filename)
-
path.join('/fold1','//folder2','../index.html')
的结果是什么?/folde1/index.html
-
path.resolve('/fold1','/folder2','../hello.html')
的结果是什么?/hello.html
-
写出读取同级文件data.txt内容的代码
Data.txt
Hello world
index.js
const fs = require('node:fs') fs.readFile('./data.txt')
-
NPM是什么?
Node 软件包管理器
-
package.json
文件的用途是什么?用于描述模块文件。
-
使用第三方模块一共有四步,你认为有哪四步?
- 查找模块:登录npmjs.com 查询一个你要的第三方模块
- 安装模块
- 引入模块
- 使用模块
3月29日上午笔记
全局变量
__dirname
定义
__dirname
表示当前文件(模块)所在的目录名称。
- Dir: directory 文件夹、目录
- Name: 名字
语法
console.log(__dirname) //全局直接调用
示例
console.log(__dirname)
输出
/Users/zj/Desktop/7/0329
绝对路径 VS 相对路径
# 绝对路径
\Users\zj\Desktop\7\0329
\zj\Desktop\7\0329
\Desktop\7\0329
# 相对路径有三种
images/aaa.jpg
./images/aaa.jpg
../images/aaa.jpg
__filename
定义
__filename
表示当前文件(模块)的名称。
- file: 文件
- Name: 名字
示例
console.log(__filename)
输出
/Users/zj/Desktop/7/0329/1-global.js
内置模块 Path
定义
node:path
是一个内置模块。它提供了处理路径的API。路径分为:
- 文件路径
- 文件夹路径
使用path
模块,第一步做什么?
1path.basename()
定义
语法
path.basename('路径','删除的后缀名')
返回值
返回 path
的最后一部分
示例
const path = require("node:path")
console.log(__filename);
console.log(path.basename(__filename));
console.log(path.basename(__filename,'.js'));
console.log(path.basename(__dirname));
输出
/Users/zj/Desktop/7/0329/2-path.js
2-path.js
2-path
0329
2path.dirname(path)
定义
dirname()
用于返回当前目录的路径。
语法
path.dirname('path')
返回值
示例
3path.extname(path)
定义
返回的是当前文件的扩展名。
语法
返回值
示例
4path.parse()
定义
parse()
方法:从路径字符串返回一个对象。
语法
path.parse('路径')
返回值
返回一个表示路径的对象。
示例
console.log(__filename);
console.log(path.parse(__filename));
输出
{
root: '/',
dir: '/Users/zj/Desktop/7/0329',
base: '2-path.js',
ext: '.js',
name: '2-path'
}
5path.format()
定义
format()
方法:从路径对象转路径字符串。
语法
path.format(路径对象)
返回值
返回路径字符串
示例
const obj = path.parse(__filename)
console.log(path.format(obj));
6path.join()
定义
join()
方法用于把路径片段连接为规范路径。
简言之:连接路径片段。
语法
path.join()
path.join('路径片段1','路径片段2',...)
返回值
返回一个拼接好的规范的路径
示例
const p1 = path.join('fold1','folder2','index.html')
console.log(p1);
const p2 = path.join('/fold1','folder2','index.html')
console.log(p2);
const p3 = path.join('/fold1','//folder2','index.html')
console.log(p3);
const p4 = path.join('/fold1','//folder2','./index.html')
console.log(p4);
const p5 = path.join('/fold1','//folder2','../index.html')
console.log(p5);
输出
fold1/folder2/index.html
/fold1/folder2/index.html
/fold1/folder2/index.html
/fold1/folder2/index.html
/fold1/index.html
7path.isAbsolute()
定义
isAbsolute()
方法用于检测一个路径是否是绝对路径。
语法
path.isAbsolute(path)
返回
返回布尔值 :true 或 false
示例
console.log(path.isAbsolute(__filename));//true
console.log(path.isAbsolute('./data.json')); //false
8path.resolve()
定义
resolve()
方法用于解析为绝对路径。
语法
path.resolve([...paths])//路径片段
返回值
返回绝对路径字符串
示例
const p1 = path.resolve('fold1','folder2','index.html')
folder1/folder2/index.html
/Users/zj/Desktop/7/0329/
/Users/zj/Desktop/7/0329/fold1/folder2/index.html
console.log(p1);
const p2 = path.resolve('/fold1','folder2','index.html')
console.log(p2);
const p3 = path.resolve('/fold1','/folder2','index.html')
console.log(p3);
const p4 = path.resolve('/fold1','//folder2','./index.html')
console.log(p4);
const p5 = path.resolve('/fold1','/folder2','../hello.html')
console.log(p5);
FS模块(FS系统)
定义
FS
文件系统模块允许操作计算机系统上的的文件。具体操作如下:
- 读取
- 创建
- 修改
- 删除
引入FS文件系统
要使用fs文件系统,请先引入fs模块
语法:基于回调函数(默认)
const fs = require("node:fs")
fs.readFile()
定义
readFile()
方法用于(异步)读取文件内容。
语法
fs.readFile('文件路径',callback)
fs.readFile('文件路径',(err,data) => {
if(err) console.log(err)
console.log(data)
})
返回值
返回读取成功的内容。
数据类型:buffer
示例:
fs.writeFile()
定义
writeFile()
用于异步的写入文件数据。
语法
fs.writeFile(file, data[, options], callback)
返回值
示例
npm是什么
- NPM 是"Node Package Manager"的缩写,意思:Node软件包管理工具
- NPM的主要内容
- 安装软件包
- 删除软件包
- 分享你自己写的软件包(npmjs.com)
- NPM是世界上最大软件包平台。
- NPM的构成:
- 官网(https://npmjs.com): 查询软件包
- CLI(Command Line Interface):命令行交互工具
- 软件注册表:JS软件包的仓库
package是什么
- 意思:软件包
- 一个package由1个或多个module组成。
package.json是什么
用于描述你的模块文件。
用于配置你的模块文件。
package.json描述了如何使用模块文件。
一个pacakge(软件包)必须包含一个
package.json
文件。-
package.json文件的创建方法:
手动创建
半自动:npm init命令创建
自动:npm init --yes命令创建
node_modules
- 用于存储第三方模块的文件
- 打包项目发给别人之前,可删除node_modules文件夹,以减少文件体积。
- 注意:package.json和package-lock.json不能删
- 可使用
npm install
重新安装模块
module
- 模块就是一个js文件或文件夹
- 模块必须拥有
package.json
文件
第三方模块的使用方法
第一步:创建文件夹
mkdir buhaoqi-package
第二步:创建index.js
cd buhaoqi-package
New-item index.js
第三步:安装upper-case模块
npm install upper-case
第四步:修改index.js内容
const upperCase = require('upper-case').upperCase
function hello(name){
console.log(upperCase(`hello ${name},good good study!`));
}
hello('zhangsan')
module.exports = hello
第五步:运行index.js
node index
输出结果
HELLO ZHANGSAN,GOOD GOOD STUDY!
版本号
NPM采用的是Sementic Version Controls系统
语法
X.Y.Z
1.1.3
初始版本号一般默认:0.1.0
正式发布:1.0.0
X : Major Version 主版本号:较大变化
Y: Minor Version 副版本号:增加了一个函数
Z: patch Version Bug版本号:修复bug
3月29日日考
http模块的用途是什么(创建服务器)
如何引入http模块: require("node:http")
-
创建服务器分为哪几步骤:
步骤1:const http = 引入http模块
步骤2:const server = http.createServer()
步骤3:server.listen()
const server = http.createServer() server.listen()
设置响应头的方法: res.writeHead()
-
使用
Content-Type
设置内容类型时的值有哪几种?(学过的)text/plain text/html application/json
-
写出在lib.js文件中导出模块的代码
//lib.js const sum = (a,b) => { return a + b } const minus = (a,b) => { return a - b } module.exports = {sum,minus}
-
写出在Index.js中调用sum和minus的方法,计算5和3点和 计算5和3点差
//方法1 const {sum,minus}=require('./libs') sum(5,3) minus(5,3) //方法2 const obj =require('./libs') const {sum,minus} = obj sum(5,3) minus(5,3) //方法3 const obj =require('./libs') obj.sum(5,3) obj.minus(5,3)
模块是什么: 模块是封装在js文件中的代码块
-
模块系统有几种?
CommonJS ESM = ECMAScript Module
-
res.end()的含义是什么
通知客户端响应结束
3月28日项目介绍
【问候】:同学们好!老师好!我是xxx。
【项目介绍】
第一部分:介绍项目名称:图库APP
第二部分:效果展示
- 导航效果展示:什么时候显示? 什么时候隐藏?
- 图片效果展示:无限加载
- 第一组图片默认加载20张
- 滚动条滑动到底,加载第二组图片
- 再次滑动到底,加载第三组图片
第三部分:项目技术介绍
这个项目一共用到了几种技术:
- 导航菜单使用的boostrap框架实现的。
- 图片数据使用的免费数据接口
- 加载图片使用了三种技术
- AJAX /Fetch API
- 懒加载
- 瀑布流(图片排列)
3月28日
日考
进入用户根目录的命令是
cd ~
进入根目录的命令是
cd /
删除文件夹的命令是
rm
创建文件夹的命令是
mkdir
-
查看aaa文件夹下有哪些内容的命令是
ls aaa
-
Node.js中的module是什么?
模块指封装在js文件中的代码块。 Node会把任何一个js文件看出一个模块。
-
NodeJS中的module系统分为几种?
- 默认模块系统:CommonJS Module - 标准模块系统:ECMAScript6 Module
-
NodeJS中的module分为几种?
- 本地 - 内置 - 第三方
-
写出在lib.js文件中导出模块的代码
//lib.js const sum = (a,b) => { return a + b } const minus = (a,b) => { return a - b } module.exports = {sum,minus}
-
写出在Index.js中调用sum和minus的方法,计算5和3点和 计算5和3点差
//index.js const obj = require('./lib') //const {sum,minus} = obj obj.sum(5,3) obj.minus(5,3)
http 内置模块
http.createServer()
定义
createServer()
用于创建Node服务器。
- 创建服务端和客户端通信的方式。
- res对象:使用响应对象设置响应头。
- 响应头:用于通知浏览器:
- 状态码
- 数据类型是什么
- 数据
- 其他参数
- 响应头:用于通知浏览器:
- req对象:使用请求对象解析请求头。
- 请求头:包含了请求的具体信息。
- 请求方法:get post put delete
- 请求数据
- 请求的地址
- 浏览器的信息
- 等其他信息
- 请求头:包含了请求的具体信息。
语法
http.createServer((req,res) => {
//1.解析请求
//2.处理响应
res.writeHead()//设置响应头
res.end()
})
返回值
示例
res.writeHead()
定义
res.writeHead()
用于设置响应头信息。
语法
返回值
示例
res.end()
定义
res.end()
用于通知客户端响应结束。结束的时候可以携带一些数据。
语法
返回值
示例
server.listen()
定义
Server.listen()
用于设置服务器的监听端口。
语法
返回值
示例
Node监听
定义
Node监听就是在不重启服务器的情况下,自动刷新页面。
语法
node --watch 文件地址
示例
node --watch './app/index.js'
Conten-Type
定义
Content-Type
用于指定响应头的数据类型。
语法
{"Content-Type": 属性值}
属性值:
-
text/plain
: 文本/普通文本 -
text/html
: 文本/html文本 -
application/json
: JSON文本
3月27日
知识点
- 习惯使用搜索打开APP
- 5个命令。每人创建一个命令笔记,专门整理命令
- 学会使用环境变量(全局变量)
- 命令行使用技巧
- Node.js中的module是什么?
- NodeJS中的module系统分为几种?
- NodeJS中的module分为几种?
cd命令
定义
cd命令用于改变目录。cd即:change directory
示例
# bash下面使用#注释
# 进入当前目录下的images目录
cd images
# 进入当前目录下的images目录
cd ./images
# 进入上一级目录下的aaa目录
cd ../aaa
# 进入当前硬盘的根目录
cd /
# 进入当前用户的根目录
cd ~
pwd
定义
pwd
用于显示当前位置。
ls
定义
ls
用于查看当前目录下的内容(文件和文件夹)
mkdir
定义
mkdir
用于创建文件夹。即"make directory"
示例:
# 在当前目录下创建一个aaa的文件夹
mkdir aaa
# 在当前用户的桌面上创建一个bbb的文件夹
mkdir ~/desktop/bbb
# 在根目录下创建一个ccc的文件夹
mkdir /ccc
rm
定义
rm
用于删除指定的目录或文件。rm
是"remove"的缩写
参数
-r
递归删除
-f
强制删除 f: force: 强制、暴力、武力
示例
文件目录分两种:空目录 和 非空目录
- users
- projectA (删除projectA)
- index.html
- css
- style.css
命令行使用技巧
- 打开命令行:
- 全局打开:搜索框 => 输入power
- 定位文件夹打开:按住shift + 右键点空白
- 快速补全:输入一个字母+tab键可以补充全名
- 快速查询上一条录入:使用
上方向键
Node是什么
Node.js是一个基于V8引擎运行环境。
- v8引擎:JS的渲染器
Node.js是一个服务器平台。
Node.js底层使用C++编写的。
Node.js是安装在操作系统上的一个程序,这个程序的工作的时候是跟操作系统在对话。(交互)
Node执行js的方式
在Node.js中,运行js代码的方式有两种
- 直接运行js文件:
node app.js
- 使用
REPL
模式运行js代码- R:Read读取js代码
- E: Execute执行JS代码
- P:Print打印js代码
- L: Loop 循环js代码
NodeJS VS 浏览器
Node和浏览器都是运行js的环境
Node.js | 浏览器 | |
---|---|---|
语法相同 | 支持ECMAScript | 支持ECMAScript |
API不同 | Global、module、buffer、domain等 | BOM、DOM |
老大不同 | Global | window |
交互对象 | 在node.js运行js,是和操作系统对话 | 在浏览器中运行js,,是和浏览器对话 |
module API是什么
module
是一个内置的全局对象。module
用于表示模块。-
模块:模块就是封装在一个js文件中的代码块。(在Node的模块系统中,每一个js文件都是一个模块)
const sum = (a,b) => { return a + b } const minus = (a,b) => { return a - b }
module对象
> module
Module {
id: '<repl>',
path: '.',
exports: {},
filename: null,
loaded: false,
children: [],
paths: [
'/Users/zj/Desktop/7/0327/repl/node_modules',
'/Users/zj/Desktop/7/0327/node_modules',
'/Users/zj/Desktop/7/node_modules',
'/Users/zj/Desktop/node_modules',
'/Users/zj/node_modules',
'/Users/node_modules',
'/node_modules',
'/Users/zj/.node_modules',
'/Users/zj/.node_libraries',
'/usr/local/lib/node'
]
}
NodeJS中的module系统分为几种?
模块系统的背景
JS缺点1:没有模块
-
JS缺点2:存在命名冲突(set map 模块)
<head> <script src='./jquery.js'></script> <script scr='./tquery.js'></script> <script scr='./script.js'></script> </head>
CommonJS : 面向服务器 通过
Require()
RequireJS: 基于CommonJS的一个包装。
AMD: Asynchrouns Module D? :面向浏览器
Node.js的模块系统分为两种
- CommonJS: Node.js的默认模块系统。采用第三方的模块系统。
- ECMAScript: 是Node.js的标准模块系统。(向原生语言看齐)
NodeJS中的module分为几种?
- 本地模块:在项目中,由开发者创建的模块。
- 内置模块:由Node.js提供的预设模块。
- 内置模块是全局模块。
- 内置模块是Node.js的核心模块。
- 第三方模块: 在项目中,由其他开发者创建的模块。
NPM是什么
- NPM: Node Package Manager Node软件包管理器
- NPM就是Node.js平台的商店。
CommonJS模块系统
module对象
定义
- module对象表示一个模块。
- 一个JS文件就是一个模块。
- 模块是封装在js文件中代码块,拥有独立的作用域。
- module对象是一个全局对象。
module.prototype.require()
定义
require()
方法用于加载外部模块。
-
require()
是node的一个内置函数。 -
require()
在工作的时候,它用于包裹(读取+执行)模块文件中的代码块。
语法
module.require(id)
require(id) //module是全局对象,可省略
Id: 表示加载的模块的文件名
返回值
返回从模块文件中导出的模块
示例
module.exports
定义
module.exports
用于暴露/导出/分享模块。(暴露作用域)
-
module.exports
是一个对象。 -
Module.exports
用于包裹要导出的模块。
语法
//语法1:导出单个变量(变量名、函数名、类名)
const sum = (a,b) => {
return a + b
}
module.exports = sum //单个变量名
//语法2:导出单个直接量
module.exports = (a,b) => {
return a + b
}
//语法3:导出多个变量
const sum = (a,b) => {
return a + b
}
const minus = (a,b) => {
return a - b
}
module.exports = {
// sum:sum,
// minus: minus
sum,
minus
}
//语法4:导出多个变量
module.exports.sum = (a,b) => {
return a + b
}
module.exports.minus = (a,b) => {
return a - b
}
//语法5:导出多个变量
module.exports = {
sum : (a,b) => {
return a + b
},
minus : (a,b) => {
return a - b
}
}
//语法6:导出多个变量
const obj = {
sum : (a,b) => {
return a + b
},
minus : (a,b) => {
return a - b
}
}
module.exports = obj
APP1.js
const math = module.require('./lib1')
// const {sum,minus} = math
console.log(math.sum(3,3));
console.log(math.minus(3,3));
// console.log(sumFn(3,3))