【无标题】

`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 '&gt;'

      case '"':

        return '&quot;'

      case '&':

        return '&amp;'

    }

  })

}

```

```js

// test.js

const itheima = require('./flightloong-tools/index')

// 转义 Html 字符串

const htmlStr = '<h4 title="abc">这是h4标签<span>123&nbsp;</span></h4>'

const str = itheima.htmlEscape(htmlStr)

console.log(str)

`

#### 5.8 在 `index.js` 中定义还原 HTML 的方法

```js

// 定义还原 HTML 字符的函数

function htmlUnEscape(str) {

  return str.replace(/&glt;|&gt;|&quot;|&amp;/g, (match) => {

    switch (match) {

      case '&glt;':

        return '<'

      case '&gt;':

        return '>'

      case '&quot;':

        return '"'

      case '&amp;':

        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

上一篇:Auto.js 调用插件require


下一篇:vue使用echarts报错