Node.js
-
引入 fs 模块 --require('fs')
-
调用 writeFile 写入内容
-
调用 readFile 读取内
fs 模块
path 模块
由于使用的是相对路径,它相对的是命令执行的路径,而不是当前文件所在的路径,所以要解决文件读取的缺陷,就要使用 path 模块
__dirname :内置全局变量,表示当前文件所在的目录(绝对路径)
使用 path.join() 和 __dirname 来填写要查找的目标文件绝对地址
fs.readFile(path.join(__dirname,'../text.txt'), ( err,data )=> { console.log(err) console.log(data.toString()) })
正则表达式
加号 + 是 1 次 及以上,此时所有量词都是贪婪模式
\r 回车符
\n 换行符
星号 * 表示 0 次及以上
贪婪模式:会一直匹配,直到当前数据的最后一个符合条件的,才会匹配停止
关闭贪婪模式: 在当前量词的后面加一个 ?就可以了(使用 问号,可以 【 ??】)
jss.replace(/[\r\n]/g, ' ') .replace(/\s+/g, ' ') .replace(/console.log\(.+?\)/g , '')
http 模块
运行本服务在终端,用浏览器访问 http://localhost:3000/ 发起请求(localhost 是本机域名)
注意:终端里启动了服务,如果想要终止按 ctrl c 停止即可
监听 require 事件 ,对本次请求,做一些响应处理
http 请求是指 :一次请求对应着一次响应
require 事件,有两个参数:
参数一:req 请求对象,这一次用户请求的信息
参数二:res 响应对象,这一次要响应给用户的信息
//引入 http 模块,创建 Web 服务对象 const http = require('http') const server = http.createServer() // 监听 request 事件,对本次请求,做一些响应处理 server.on('request', (req, res) => { console.log('请求了') res.end('Hello World') }) // 启动 Web 服务监听对应端口号 server.listen(3001, ()=> { // 服务器启动 console.log('服务器启动') })
目标:Web 服务支持中文字符
问题:返回响应内容为,中文字符,浏览器无法正确显示
原因:Web 服务没有设置响应头,指定说明内容类型和编码格式
解决:设置响应头内容类型,让请求方能正确解析
语法:res.setHeader('Content-Type', 'text/html;charset=utf-8')
运行 Web 服务,用浏览器发送请求
text/html;charset=utf-8 ~响应的是 HTML 字符串,编码为 utf-8
res.setHeader('Content-Type', 'text/html;charset=utf-8')
application/json;charset=utf-8 ~响应的是 JSON 字符串,一般是写接口用的
text/plain;charset=utf-8 ~普通文本
querystring 模块方法
格式化查询字符串
/** * 目标:基于 Web 服务,开发-城市列表数据接口 * 步骤: * 1. 判断 req.url 资源路径+查询字符串,路径前缀匹配/api/city * 2. 借助 querystring 模块的方法,格式化查询参数字符串 * 3. 读取 city.json 城市数据,匹配省份名字下属城市列表 * 4. 返回城市列表,启动 Web 服务测试 */ // 创建 Web 服务 const fs = require('fs') const path = require('path') const http = require('http') const ser = http.createServer() const querystring = require('querystring') // 监听 request 事件,对本次请求,做一些响应处理 ser.on('request', (req, res) => { if (req.url === '/api/pci') { // 读取内容 fs.readFile(path.join(__dirname, 'data/province.json'), (err, data) => { // 错误,趁早返回 if (err) return console.log(err) // 转换中文字符串,响应的是 JSON 字符串,一般是写接口用的 res.setHeader('Content-Type', 'application/json;charset=utf-8') // res.end 返回到页面的内容 res.end(data.toString()) }) // 判断,路径以 /api/city 开头的,不能使用全等,因为后面数据比较杂 } else if (req.url.startsWith('/api/city')) { // 切割从页面返回来的数据,转成数组,取数组 1 const paramStr = req.url.split('?')[1] // .parse() 是querystring模块的一个方法,专门用来解析的(将 乱码 转换成 中文) const paramObj = querystring.parse(paramStr) // 读取本地内容 fs.readFile(path.join(__dirname, 'data/city.json'), (err, data) => { // 趁早返回 if(err) return console.log(err) // 获取到的内容是 JSON字符串,转换为 对象才好操作 const zj = JSON.parse(data.toString()) // 获取到对应的数组 const jname = zj[paramObj.pname] // 响应的是 JSON 字符串,一般是写接口用的 res.setHeader('Content-Type', 'application/json;charset=utf-8') // 将对象 转换为 JSON 字符串 res.end(JSON.stringify(jname) ) }) } else { // 其他情况下,报错 res.end('404') } }) // 请求地址的端口号 ser.listen(3010, () => { console.log('服务器启动') })
CommonJS 标准 模块化的导入导出
module.exports 导出模块
导入模块
// 导入模块 const obj = require('./utils')
ECMAScript 标准 - 默认导出和导入
Node 默认采用的 CommonJS 标准,所以默认情况下无法直接使用Es6 模块化标准,需要 在当前文件夹 新建 package.json 文件,并设置 {"type":"module"}
不管是什么模块化的标准,目的都是为了实现模块化,将其他模块导入到自己模块中使用,自己的模块可以暴露给其他模块使用
在 Node 中就使用默认的 CommonJS 标准,以后写前端就全部使用 ES6 标准模块化
ES6默认导入语法:
import 变量名 from '模块名或者路径'
ECMAScript 标准 - 命名导出和导入
默认导出和导入 和 命名导出和导入 的区别在于 命名导出和导入 可以按需导出
这两个 导出和导入 方式可以同时使用
const baseURL = 'http://hmajax.itheima.net' // 命名导出 export const getArraySum = arr => arr.reduce((sum, item) => sum += item, 0) // 默认导出 export default { baseURL } ------------------------------------------------------------ // 命名导入 import { getArraySum } from "../01/utils.js"; // 默认导入 import obj from './utils.js
在写模块时, 模块名 or 路径 ?
自己写的模块就写路径,其他情况都是模块名(内置的 / 下载的)
npm 软件包
-D ~安装开发依赖(只有在开发时使用,项目上线就不在需要了)
npm i nodemon -g ~安装 nodemon,它可以检查代码更新,自动重启程序
node xxx ~执行js文件
package.json
npm init -y ~初始化
npm i 软件包名 ~下载本地软件包
npm i 软件包名 -g ~下载全局软件包
npm uni 软件包名 ~删除软件包
解决路径问题
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Web pack 打包工具
-D ~安装开发依赖(只有在开发时使用,项目上线就不在需要了)
npm run 要运行的命令 ~运行命令
source map 仅适用于开发环境,不要在生产环境使用(防止被轻易查看源码位置)