美文网首页
nodejs基础

nodejs基础

作者: 巧克力_404 | 来源:发表于2021-04-20 00:02 被阅读0次

课程目标

  • 掌握异步I/O概念
  • promisify用法、流、buffer
  • 掌握一个简单http服务(页面、json数据、静态资源)
  • 实战一个cli工具(vue路由约定)

Nodejs是一个异步的事件驱动的javascript运行时 特性:非阻塞 I/o 事件操作类比学习运行时这个概念JRE java运行时概念C Runtime .NET Common Language Runtime 运行时rumtime就是程序运行的时候,运行时库就是程序运行的时候所需要依赖的库,运行的时候指的是指令加载到内存并由cpu执行的时候,C代码编译成可执行文件的时候,指令没有被cpu执行,这个时候算是编译时,就是编译的时候。
与前端的不同 :js核心语法不变 前端是操作BOM DOM 后端是fs http buffer event os
看一下核心API:
fs 文件系统

// 03-fs.js
const fs = require('fs');
// 同步调用
const data = fs.readFileSync('./conf.js'); //代码会阻塞在这里 console.log(data);
// 异步调用
fs.readFile('./conf.js', (err, data) => {
    if (err) throw err;
    console.log(data);
})
// promisify
const {promisify} = require('util')
const readFile = promisify(fs.readFile)
readFile('./conf.js').then(data=>console.log(data))
// fs Promises API node v10
const fsp = require("fs").promises;
fsp
  .readFile("./confs.js")
  .then(data => console.log(data))
  .catch(err => console.log(err));
// async/await
(async () => {
    const fs = require('fs')
    const { promisify } = require('util')
    const readFile = promisify(fs.readFile)
    const data = await readFile('./index.html')
    console.log('data',data)
})()
// 引用方式 Buffer.from(data).toString('utf-8')

fs阻塞代码实例 和 非阻塞代码实例

EventEmitter

image

EventEmitter 的核心就是事件触发与事件监听器功能的封装

Buffer缓冲区

Buffer - 用于在 TCP 流、文件系统操作、以及其他上下文中与八位字节流进行交互。 八位字节组 成的数组,可以有效的在JS中存储二进制数据

// 04-buffer.js
// 创建一个长度为10字节以0填充的Buffer 
const buf1 = Buffer.alloc(10); console.log(buf1);
// 创建一个Buffer包含ascii.
// ascii 查询 http://ascii.911cha.com/ 
const buf2 = Buffer.from('a') console.log(buf2,buf2.toString())
// 创建Buffer包含UTF-8字节
// UFT-8:一种变长的编码方案,使用 1~6 个字节来存储;
// UFT-32:一种固定长度的编码方案,不管字符编号大小,始终使用 4 个字节来存储;
// UTF-16:介于 UTF-8 和 UTF-32 之间,使用 2 个或者 4 个字节来存储,长度既固定又可变
const buf3 = Buffer.from('Buffer创建方法');
console.log(buf3);
// 写入Buffer数据 buf1.write('hello'); 
console.log(buf1);
// 读取Buffer数据 
console.log(buf3.toString());
// 合并Buffer
const buf4 = Buffer.concat([buf1, buf3]);
console.log(buf4.toString());
// 可以尝试修改fs案例输出文件原始内容

Buffer类似数组,所以很多数组方法它都有 GBK 转码 iconv-lite

http服务
创建一个http服务器,05-http.js

const http = require('http');
const server = http.createServer((request, response) => {
    console.log('there is a request');
    response.end('a response from server');
});
server.listen(3000);
// 打印原型链
function getPrototypeChain(obj) {
        var protoChain = [];
while (obj = Object.getPrototypeOf(obj)) {//返回给定对象的原型。如果没有继承属 性,则返回 null 。
            protoChain.push(obj);
        }
        protoChain.push(null);
        return protoChain;
    }

显示一个首页

const {url, method} = request;
    if (url === '/' && method === 'GET') {
        fs.readFile('index.html', (err, data) => {
            if (err) {
                response.writeHead(500, { 'Content-Type':'text/plain;charset=utf-8' });
               response.end('500,服务器错误');
               return ;
            }
            response.statusCode = 200;
            response.setHeader('Content-Type', 'text/html');
            response.end(data);
        });
   } else {
      response.statusCode = 404;
      response.setHeader('Content-Type', 'text/plain;charset=utf-8'); 
      response.end('404, 页面没有找到');
 } else if (url === '/users' && method === 'GET') {
    response.writeHead(200, { 'Content-Type': 'application/json' });
    response.end(JSON.stringify([{name:'tom',age:20}]));
}

module

Node.js 提供了 exports 和 require 两个对象,其中 exports 是模块公开的接口,require 用于从外部获取一个模块的接口,即所获取模块的 exports 对象。
查看详情

Stream流
stream - 是用于与node中流数据交互的接口

//二进制友好,图片操作,06-stream.js
const fs = require('fs')
const rs2 = fs.createReadStream('./01.jpg') 
const ws2 = fs.createWriteStream('./02.jpg') rs2.pipe(ws2);
//响应图片请求,05-http.js
const {url, method, headers} = request;
else if (method === 'GET' && headers.accept.indexOf('image/*') !== -1) {
    fs.createReadStream('.'+url).pipe(response);
}

Accept代表发送端(客户端)希望接受的数据类型。 比如:Accept:text/xml; 代表客户端希望 接受的数据类型是xml类型。
Content-Type代表发送端(客户端|服务器)发送的实体数据的数据类型。 比如:Content- Type:text/html; 代表发送端发送的数据格式是html。
二者合起来, Accept:text/xml; Content-Type:text/html ,即代表希望接受的数据类型是xml格 式,本次请求发送的数据的数据格式是html。

约定路由功能

  • loader 文件扫描
  • 代码模板渲染 hbs Mustache风格模板
const fs = require('fs')
const handlebars = require('handlebars')
const chalk = require('chalk')
module.exports = async () => {
// 获取页面列表 const list =
        fs.readdirSync('./src/views')
            .filter(v => v !== 'Home.vue')
            .map(v => ({
                name: v.replace('.vue', '').toLowerCase(),
file: v }))
// 生成路由定义 
compile({
list
    }, './src/router.js', './template/router.js.hbs')
// 生成菜单 
compile({
list
    }, './src/App.vue', './template/App.vue.hbs')
/**
* 编译模板文件
* @param meta 数据定义
* @param filePath 目标文件路径
* @param templatePath 模板文件路径
*/
    function compile(meta, filePath, templatePath) {
        if (fs.existsSync(templatePath)) {
            const content = fs.readFileSync(templatePath).toString();
            const result = handlebars.compile(content)(meta);
            fs.writeFileSync(filePath, result);
}
console.log(chalk.green(`🚀${filePath} 创建成功`)) }
}
//发布npm
#!/usr/bin/env bash
npm config get registry # 检查仓库镜像库
npm config set registry=http://registry.npmjs.org
echo '请进行登录相关操作:'
npm login # 登陆
echo "-------publishing-------"
npm publish # 发布
npm config set registry=https://registry.npm.taobao.org # 设置为淘宝镜像 echo "发布完成"
exit

常用工具

util 是一个Node.js 核心模块,提供常用函数的集合,用于弥补核心JavaScript 的功能 过于精简的不足

1 util.inherits 是一个实现对象间原型继承的函数
2 util.inspect 是一个将任意对象转换 为字符串的方法,通常用于调试和错误输出。它至少接受一个参数 object,即要转换的对象
3 util.isArray(object) 如果给定的参数 "object" 是一个数组返回true,否则返回false
4 util.isRegExp(object) 如果给定的参数 "object" 是一个正则表达式返回true,否则返回false
5 util.isDate(object) 如果给定的参数 "object" 是一个日期返回true,否则返回false
6 util.isError(object) 如果给定的参数 "object" 是一个错误对象返回true,否则返回false

Express 框架

Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具。使用 Express 可以快速地搭建一个完整功能的网站。

Express 框架核心特性:

可以设置中间件来响应 HTTP 请求。

定义了路由表用于执行不同的 HTTP 请求动作。

可以通过向模板传递参数来动态渲染 HTML 页面。

相关文章

  • 说明

    nodejs基础

  • Node.js 安装

    基础安装 1、到 nodejs官网 https://nodejs.org[https://nodejs.org]...

  • nodejs基础

    NodeJs是什么 Node.js is a JavaScript runtime built on Chrome...

  • nodejs基础

    Buffer: 处理二进制数据 二进制数据的获取 文件数据 网络数据 二进制数据的可读性:base64 Base6...

  • nodeJS 基础

    Node.js 可以理解为能在操作系统上跑的js(不仅仅在浏览器) 还能当web服务器哟~ 用的Chrome V8...

  • nodeJS基础

    Node.js REPL(交互式解释器) Node.js REPL(Read Eval Print Loop:交互...

  • NodeJS基础

    一、基础 关闭服务器----------------查看对应服务器端口PID : lsof -i tcp 8989...

  • Nodejs基础

    Nodejs 定义:node是javascript的解析器,是javascript服务器的运行环境。 创建服务器v...

  • NODEJS基础

    Node的小基友supervisor 每次修改代码后会自动重启。懒程序员就指望这种省事省力的工具活着了:) 安装:...

  • NodeJS基础

    Installation 1. NodeJS安装 直接执行node程序,根据系统提示安装 如果没有安装node,a...

网友评论

      本文标题:nodejs基础

      本文链接:https://www.haomeiwen.com/subject/uykklltx.html