ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【无标题】

2022-01-30 21:00:02  阅读:118  来源: 互联网

标签:const require 无标题 js 模块 path 加载


`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

标签:const,require,无标题,js,模块,path,加载
来源: https://blog.csdn.net/qq_35744728/article/details/122755215

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有