node.js (一)

71 阅读5分钟

“我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第1篇文章,点击查看活动详情

fs

在js中,使用fs模块操作文件,需要如下方式导入

const fs = require('fs');

读取指定文件中的内容

//path 必选参数 字符串 表示文件路径
//options 表示以什么编码格式读取文件
//callback 必选 通过回调函数拿到读取的结果
fs.readFile(path,[options],callback)

向指定文件中写入内容

文件路径
写入内容
写入格式
回调函数
//只可创建文件 不能创建路径
//写入内容覆盖原内容
fs.writeFile(file,data,[options],callback)

路径动态拼接

1. 使用绝对路径
2. __dirname 表示当前文件所处目录
使用__dirname拼接路径

path

将多个路径片段拼接成一个完整的路径字符串


path.join([...paths])

从路径字符串中解析出文件名


path.basename()

获取路径中的文件扩展名

path.extname()

http

导入http模块

const http = require('http')

创建web服务器

创建web服务器实例

//创建一个web服务器实例
const server = http.createServer()

为服务器绑定request事件,监听客户端请求

//req是请求对象 包含与客户端相关的数据和属性
//res响应对象 包含与服务器相关的数据和属性
server.on('request',(req,res) => {
	console.log(req.url)
	console.log(req.method)
	//向客户端发送内容,结束请求的处理过程
	res.end('响应数据')
})

启动服务器

server.listen(端口号,() => {})

解决中文乱码

server.on('request',(req,res) => {
	//手动设置Content-Type响应头内容编码格式
	res.setHeader('Content-Type','text/html; charset=utf-8')
	res.end('响应数据')
})

根据不同url响应不同的内容

server.on('request',(req,res) => {
		//获取请求的url地址	
    const url = req.url;
    	//设置默认相应内容为404 not found
    let content = '<h1>404 not found</h1>'
    	//判断用户请求地址
    if (url === '/') {
        content = '<h1>首页</h1>'
    }else if (url === '/about') {
        content = '<h1>关于</h1>'
    }
    	//设置Content-Type请求头
    res.setHeader('Content-Type','text/html; charset=utf-8')
		//响应内容给客户端
    res.end(content)
})

优化资源请求路径

let fpath = '';
if(url === '/'){
	//如果请求路径为'/',手动指定文件路径
	fpath = path.join(__dirname,'./clock/index.html')
}else {
	//如果请求路径不为'/',拼接指定文件路径
	fpath = path.join(__dirname,'/clock',url)
}

模块化

模块分类

内置模块

fs path http等

自定义模块

自定义的js文件

第三方模块

加载模块

require()

module

每个自定义模块中都有一个module对象,它里面存储了和当前模块有关的信息

module.exports

将模块内的成员导出,require导入自定义模块时,得到的是module.exports指向的对象

module.exports.name = '张三';

exports

与module.exports指向一个对象

模块化规范

  1. 每个模块内部,module变量代表当前模块
  2. module.exports是对外的接口
  3. 加载模块其实是加载模块的module.exports属性,require()

nodejs的第三方模块叫做包

包是基于内置模块封装出来的

package.json

快速创建

//运行在英文目录下
npm init -y

dependencies

安装第三方模块的版本信息

devDependencies

某些包只在项目开发阶段用到,项目上线后不会用到,建议把这些包记录到devDependencies节点中

npm i 包名 -D 
等同于
npm i 包名 --save-dev

安装所有依赖包

npm install

卸载包

npm uninstall

查看当前下包镜像源

npm config get registry

切换为淘宝镜像源

npm config set registry=https://registry.npm.taobao.org/

nrm

利用nrm提供的终端命令,可以快速查看和切换下包的镜像源

npm i nrm -g

查看所有可用镜像源

nrm ls

切换为淘宝镜像

nrm use taobao

i5ting_toc

将md文档转为html页面的工具

//安装
npm i -g i5ting_toc
//转html页面
i5ting_toc -f md文件路径 -o

规范结构

  1. 单独目录存在
  2. 顶级目录下包含package.json包管理配置文件
  3. package.json中必须包含 name version main 这三个属性,分别代表 包的名字,版本号,包的入口

发布包

初始化包的基本结构

  1. 新建文件夹作为包的根目录
  2. 新建三个文件 包管理配置文件 package.json 包的入口文件 index.js 包的说明文档 README.md

初始化package.json

{
    //包名
    "name": "tools",
    // 包的版本号
    "version": "1.0.0",
    // 包的入口文件
    "main": "index.js",
    // 包的描述信息
    "description": "工具",
    // 搜索的关键字
    "keywords": ["a","b"],
    // 遵循的开源许可协议
    "license": "ISC"
}

在index.js中定义方法并导出

将不同功能进行模块化拆分

编写包的说明文档

上传

//登录
npm login
//发布
npm publish
//删除
npm unpublish 包名 --force

模块的加载机制

优先从缓存中加载

模块在第一次加载后会被缓存,后续调用会从缓存中加载,提高模块的加载效率

内置模块的加载

内置模块的加载优先级最高

自定义模块的加载机制

使用require()加载自定义模块时,必须指定./或../开头的路径标识符,否则node会把它当成内置模块或第三方模块加载

如果省略文件扩展名,则会按照以下顺序尝试加载

  1. 按照确切文件名
  2. 补全.js扩展名加载
  3. 补全.json扩展名加载
  4. 补全.node扩展名加载
  5. 加载失败报错

第三方模块加载机制

从当前模块的父目录开始,尝试从node_modules文件夹中加载第三方模块,如找不到,则移动到再上一层父目录的node_modules

目录作为模块

  1. 在被加载目录中查找package.json,寻找main属性,作为require()的入口
  2. 尝试加载index.js
  3. 终端报错