`Node` 环境中 **没有 `DOM` 和 `BOM` 的 `API`**,即在 `Node` 中无法调用 `DOM` 和 `BOM` 等浏览器内置 `API`
JavaScript 基础语法 --> **`Node.js` 内置 `API` 模块**(`fs`、`path`、`http` 等) --> **第三方 `API` 模块**(express、`mysql` 等)
基于 [Express 框架](http://www.expressjs.com.cn/),可以快速构建 `Web` 应用
安装包在 `Node.js` 官网首页直接[下载](https://nodejs.org/en/),点击绿色的按钮,下载所需的版本后,双击直接安装即可--LTS `为长期稳定版
打开终端,在终端输入命令 `node –v` 后,按下回车键,即可查看已安装的 `Node.js` 的版本号
输入 node 要执行的 `js`文件的路径,例如
node 1.js
4.1 `fs` 文件系统模块
- `fs.readFile()` 方法,用来读取指定文件中的内容
fs.readFile(path[, options], callback)
参数解读:
1. 参数1:必选参数,字符串,表示文件的路径
2. 参数2:可选参数,表示以什么编码格式来读取文件,一般默认是 utf8
3. 参数3:必选参数,文件读取完成后,通过回调函数拿到读取的结果
// 参数 3: 回调函数,拿到读取失败和成功的结果, err 以及 data
fs.readFile('./Tom.txt', 'utf8', function (err, data) {
// 3. err
结果是 null ,说明文件读取成功
如果不为 null,说明文件读取失败
// 如果读取失败,则 err 的值不为null
// 如果读取失败,则 err 的值为错误对象, data 的值为 undefined
console.log(err)
// 4. data 打印成功的结果
console.log(data)
})
`fs.writeFile()` 方法,用来向指定的文件中写入内容
fs.writeFile(file, data[, options], callback)
写入成功,则 err 的值等于 null
如果文件写入失败,则 err 的值等于一个错误对象
1. 参数1:必选参数,需要指定一个文件路径的字符串,表示文件的存放路径
2. 参数2:必选参数,表示要写入的内容
3. 参数3:可选参数,表示以什么格式写入文件内容,默认值是 `utf8`
4. 参数4:必选参数,文件写入完成后的回调函数
2. 如果要在 `JavaScript` 代码中,使用 `fs` 模块来操作文件,则需要使用如下的方式先导入它
const fs = require('fs')
data.split(' ') const newArr = [] forEach push replace
join
不要提供 `./` 或 `../` 开头的相对路径, 防止路径动态拼接的问题
#### 5.3 使用 `__dirname`表示当前文件所处的目 解决路径拼接问题 fs.readFile(__dirname + '/Tom.txt',
### 6. `path` 路径模块
-
const path = rquire('path')
##### 6.2.1 `path.join()` 拼接的语法格式
使用 `path.join()` 方法,可以把多个路径片段拼接为完整的路径字符串,语法格式如下
path.join([...paths])
参数解读: 1. `...paths` <string> 路径片段的序列
2. 返回值: <string>
凡是涉及到路径拼接 不要直接使用 + 进行字符串的拼接
// 使用 path.join() 做路径分割
fs.readFile(path.join(__dirname, '/Tom.txt')
#### 6.3 获取路径中的文件名
##### 6.3.1 `path.basename()` 的语法格式
使用 `path.basename()` 方法,可以获取路径中的最后一部分,经常通过这个方法获取路径中的文件名,语法格式如下
path.basename(path[, ext])
参数解读:
1. path <string> 必选参数,表示一个路径的字符串
2. ext <string> 可选参数,表示文件扩展名
3. 返回: <string> 表示路径中的最后一部分
const fpath = '/a/b/c/d/index.html' // 文件的存放路径
var fullName = path.basename(fpath)
console.log(fullName) // index.html 打印出文件的名称
var extName = path.basename(fpath, '.html')
console.log(extName) // index 打印文件的名称,但是忽略后缀名
使用 `path.extname()` 方法,可以获取路径中的扩展名部分,语法格式
path.extname(path)
参数解读:
1. `path` <string >必选参数,表示一个路径的字符串
2. 返回: <string> 返回得到的扩展名字符串
const fpath = '/a/b/c/d/index.html' // 文件的存放路径
var fullName = path.extname(fpath)
console.log(fullName) // .html 返回文件的拓展名
function resolveCss(htmlStr) {
// 3.2 使用正则提取页面中的 <style></style>
const r1 = regStyle.exec(htmlStr)
// 3.3 将提取出来的样式字符串,做进一步的处理
const newCss = r1[0].replace('<style>', '').replace('</style>', '')
把内嵌的 <script> 和 <style> 标签,替换为外联的 <link> 和 <script> 标签
const newHtml = htmlStr
.replace(regStyle, '<link rel="stylesheet" href="./style/index.css" />')
.replace(regScript, '<script src="./script/index.js"></script>')
- `fs.writeFile()` 方法只能用来创建文件,不能用来创建路径
- 重复调用 `fs.writeFile()` 写入同一个文件,新写入的内容会覆盖之前的旧内容
#### 2.1 什么是 `http` 模块
const http = require('http')
1. 服务器和普通电脑的区别在于,服务器上安装了 `web` 服务器软件
调用 http.createServer() 方法,即可快速创建一个 web 服务器实例
const server = http.createServer()
3. 为服务器实例绑定 `request` 事件, 即可监听客户端发送过来的网络请求
// 使用服务器实例的 .on() 方法,为服务器绑定一个 request 事件
server.on('request', (req, res) => {
// 只要有客户端来请求我们自己的服务器,就会被触发 request 事件,从而调用这个事件处理程序
})
4. 启动服务器--调用服务器实例的 .listen() 方法,即可启动当前的 web 服务器实例
server.listen(80, () => {
console.log('running……')
})
#### 4.3 `req` 请求对象
事件处理程序中,访问与客户端相关的数据和属性,可以使用如下方式:
server.on('request', function (req, res) {
// req 是请求对象,它包含了与客户端相关的数据和属性
// req.url 获取客户端请求的 url 地址
// req.method 获取客户端请求的类型
const str = `${req.url} -- ${req.method}`
console.log(str)
})
#### 4.4 `res` 响应对象 访问与服务器相关的数据和属性
例如:将字符串发送到客户端
// res.end() 方法的作用 向客户端发送指定的内容,并结束这次请求的处理过程
res.end(str)
server.on('request', function (req, res) {
// 为了防止中文乱码问题,需要设置响应头,
res.setHeader('Content-Type', 'text/html; charset=utf-8')
根据不同的 `url` 响应不同的内容 核心实现步骤
1. 获取请求的 `url` 地址
2. 设置默认的响应内容为 `404 Not found`
3. 判断用户请求的是否为 `/` 或 `/index.html` 首页
4. 判断用户请求的是否为 `/about.html` 关于页面
5. 设置 `Content-Type` 响应头,防止中文乱码
6. 使用 `res.end()` 把内容响应给客户端
#### 5.2 动态响应内容
```js
server.on('request', function (req, res) {
// 1、获取请求的 url 地址
const url = req.url
// 2、设置默认的内容为 404 Not Found
let fpath = ''
let content = '<h4>404 Not Found</h4>'
// 3、用户请求的是首页
if (url === '/' || url === '/index.html') {
content = '<h4>首页</h4>'
} else if (url === '/about.html') {
// 4、用户请求的是关于我们页面
content = '<h4>关于我们</h4>'
}
// 5、设置 Content-Type 响应头,防止中文乱码
res.setHeader('Content-Type', 'text/html; charset=utf-8')
// 6、将内容发送给客户端
res.end(content)
})
`Node.js` 中根据模块来源的不同,将模块分为了 3 大类,分别是:
1. 内置模块(内置模块是由 `Node.js` 官方提供的,例如 `fs`、`path`、`http` 等)
2. 自定义模块(用户创建的每个 `.js` 文件,都是自定 义模块)
3. 第三方模块(由第三方开发出来的模块,并非官方提供的内置模块,也不是用户创建的自定义模块,**使用前需要先下载**)
#### 8.2 使用 `require` 方法加载模块
使用强大的 `require()` 方法,可以加载需要的**内置模块**、**用户自定义模块**、**第三方模块**进行使用。例如:
```js
// 1. 加载内置的 fs 模块
const fs = require('fs')
// 2. 加载用户的自定义模块
const custom = require('./custom.js')
// 3. 加载第三方模块,(使用第三方模块,下面会进行讲解)
const moment = require('moment')
**注意事项 1: 使用 require() 方法加载其他模块时,会执行被加载模块中的代码**
// 加载模块.js require('./被加载的模块.js')
**注意事项2: 在使用 `require` 加载用户自定义模块期间,可以省略 `.js` 后缀名**
// 加载模块.js require('./被加载的模块')
const custom = require('./被加载的模块')
在每个 `.js` 自定义模块中都有一个 `module` 对象,它里面存储了和当前模块有关的信息,打印如下:
##### 8.4.2 了解 `module.exports` 对象的作用
1. 在自定义模块中,可以使用 `module.exports` 对象,将模块内的成员共享出去,供外界使用
2. 外界用 `require()` 方法导入自定义模块时,得到的的成员就是 `module.exports` 所指向的对象
##### 8.4.3 使用 `module.exports` 向外共享成员
// 向 module.exports 对象上挂载 username 属性 sayHello方法
module.exports.username = 'zs'
module.exports.sayHello = function () {
console.log('Hellp')
}
##### 8.4.4 共享成员时的注意点
使用 `require()` 方法导入模块时,导入的结果,永远以 `module.exports` 指向的对象为准
// 使用 module.exports 指向一个全新的对象
module.exports = {
username: '小黑',
sayHi() {
console.log('小黑')
}
}
**注意:为了防止混乱,建议大家不要在同一个模块中同时使用 `exports` 和 `module.exports`**
`CommonJS `规定了**模块的特性和各模块之间如何相互依赖**
2. `CommonJS` 规定:
- 每个模块内部,`module` 变量代表当前模块
`module.exports` 是对外的接口,require() 方法用于加载模块
在学习和以后的实际开发中,下载包,都是从 [npm](https://www.npmjs.com/) 这个网站下载
2. 可以在终端中执行 `npm -v` 命令 版本号
定义格式化时间的方法
// 定义补零的函数
function dateFormat() {}
function padZero(n) {
return n > 9 ? n : '0' + n
}
module.exports = {
dateFormat
}
// 导入自定义的格式化时间的模块
const TIME = require('./014 - timeformat')
// 调用方法,进行时间的格式化
const dt = new Date()
// console.log(dt)
const newDT = TIME.dateFormat(dt)
console.log(newDT)
#### 10.2 使用第三方包对时间进行格式化
1. 使用 `npm` 包管理工具,在项目中安装格式化时间的包 `moment`
2. 使用 `require()` 导入格式化时间的包
3. 参考 `moment` 的官方 `API` 文档对时间进行格式化
const moment = require('moment')
const dt = moment().format('YYYY-MM-DD HH:mm:ss')
console.log(dt)
`i5ting_toc` 是一个可以把 `md` 文档转为 `html` 页面的小工具
const itheima = require('./flightloong-tools/index')
// 格式化时间的代码
const dtStr = itheima.dateFormat(new Date())
console.log(dtStr) // 2020-06-23 01:16:57
#### 5.7 在 `index.js` 中定义转义 HTML 的方法
```js
// index.js
// 定义转义 HTML 字符的函数
function htmlEscape(htmlstr) {
return htmlstr.replace(/<|>|"|&/g, match => {
switch (match) {
case '<':
return '&glt;'
case '>':
return '>'
case '"':
return '"'
case '&':
return '&'
}
})
}
```
```js
// test.js
const itheima = require('./flightloong-tools/index')
// 转义 Html 字符串
const htmlStr = '<h4 title="abc">这是h4标签<span>123 </span></h4>'
const str = itheima.htmlEscape(htmlStr)
console.log(str)
`
#### 5.8 在 `index.js` 中定义还原 HTML 的方法
```js
// 定义还原 HTML 字符的函数
function htmlUnEscape(str) {
return str.replace(/&glt;|>|"|&/g, (match) => {
switch (match) {
case '&glt;':
return '<'
case '>':
return '>'
case '"':
return '"'
case '&':
return '&'
}
})
}
```
```js
// 还原 Html 字符串
const resetHtml = itheima.htmlUnEscape(str)
console.log(resetHtml)
```
module.exports = {
htmlEscape,
htmlUnEscape
}
// 调用 htmlEscape 方法进行转换
内置模块的加载优先级最高**
在加载自定义模块时,如果没有指定 `./` 或 `../` 这样的路径标识符,则 `node` 会把它当作 `内置模块` 或 `第三方模块` 进行加载
2. 在使用 `require()` 导入自定义模块时,如果省略了文件的拓展名,则 `Node` 会按照顺序分别尝试加载以下文件
- 按照 **确切的文件名** 进行加载
- 补全 **`.js` **扩展名进行加载
- 补全 **`.json` ** 扩展名进行加载
- 补全 **`.node`** 扩展名进行加载
- 加载失败,终端报错
1. 如果传递给 `require()` 的模块标识符不是一个内置模块,也没有以 `'./'` 或 `'../'` 开头,则 `Node.js` 会从当前模块的父目录开始,尝试从 `/node_modules` 文件夹中加载第三方模块
2. **如果没有找到对应的第三方模块,则移动到再上一层父目录中,进行加载,直到文件系统的根目录**
返回数据
res.statusCode = 200
设置了 Content-Type 标头
res.setHeader('Content-Type', 'text/plain')
关闭响应,将内容作为参数添加到 end()
:
res.end('Hello World\n')
运行 node app.js