Node.js使用
Node.js环境说白了就和浏览器一样,用来运行js,node借助终端,浏览器借助展示HTML文件来展示js功能。具体运行在js文件的所在文件目录下运行 node xx.js
即可。
不过一般全局下载nodemon三方模块,其作用是当js文件被改动,终端会再次执行该js文件,后续模块处再讲。
模块化开发分为两种:
- 前端网页使用JavaScript外链
- 使用nodejs加载模块化开发构建
Node.js实际上是模块化开发,由以下两方面组成:
- ECMAScript
- Node的模块API(又分为内置模块和三方模块)
node环境的一些特性
异步式I/O:提高效率,防止阻塞这种情况
事件式编程:注意事件循环机制node模块化及其使用
参考之前写的文章:https://www.yuque.com/wztlink1013/blog/psazge#FPo3fprocess.env环境变量
nodejs的顶层对象process下的环境变量设置与使用
- 参考:https://juejin.cn/post/6972466143445385223
nodejs中的try…catch
写异常的捕获的时候,要时刻注意一些异步执行的代码,比如一种场景是try里面的代码是异步操作,那么再执行异步的时候,就已经执行了catch里面的报警语句了,学会查看捕获的目标代码是哪段。
具体参考:https://www.cnblogs.com/surfer/p/10291609.html
Node.js内置模块
全局对象global
Node.js和之前学过的浏览器对象区分之就是,浏览器中全局对象是window,但是Node.js的全局对象是global(也可以不写、省略)。
- process对象:关于进程的一个对象,也是global的属性之一,是一个和操作系统的简单接口。重点了解nextTick()函数,这个函数可以将事件循环设置一个任务,提高运行效率
- console对象:log在控制台中输出;error输出错误信息;trace输出错误信息调用栈(就是错在什么地方)
- setTimeout() 设置超时定时器
- clearTimeout() 清除超时时定时器
- setInterval() 设置间歇定时器
-
http;fs;url;querystring;path模块
http,原生创建web服务
- url解析url,querystring处理url参数,搭配使用
- fs模块用来读取文件、写入文件等
- path路径操作,一般都是路径字符串拼接join,
__dirname
当前目录名 ```javascript /*- @Author: wztlink1013
- @Date: 2022-01-10 16:26:41
- @LastEditTime: 2022-01-10 19:49:43
- @Description: */ let http = require(‘http’) let url = require(‘url’) let fs = require(‘fs’) let queryString = require(‘querystring’)
let server = http.createServer() // 读取我们当前文件所在的目录下的 html 文件夹 let HtmlDir = __dirname + ‘/html/‘
server.on(‘request’, function (req, res) { let urlObj = url.parse(req.url) console.log(‘【请求url信息】’, urlObj) let params = queryString.parse(urlObj.query) console.log(‘【url参数】’, JSON.stringify(params))
switch (urlObj.pathname) { case ‘/‘: //首页 sendData(HtmlDir + ‘index.html’, req, res) break case ‘/user’: //用户首页 sendData(HtmlDir + ‘user.html’, req, res) break default: //处理其他情况 sendData(HtmlDir + ‘err.html’, req, res) break } })
/**
- 读取html文件,响应数据,发送给浏览器
- @param {String} file 文件路径
- @param {Object} req request
- @param {Object} res response 对象
*/
function sendData(file, req, res) {
fs.readFile(file, function (err, data) {
if (err) {
res.writeHead(404, {
}) res.end(‘'content-type': 'text/html;charset=utf-8',
你要找的页面不见了~
‘) } else { res.writeHead(200, {
}) res.end(data) } }) } server.listen(8888) console.log(‘Server is running at http://127.0.0.1:8888/‘) ```'content-type': 'text/html;charset=utf-8',
util+chalk美化
- util.inherits
不过感觉这个已经没有多大必要了,这个是实现原型间继承的相关封装,但是现在ES6已经有了class的概念了(虽然底层还是之前那套),这个工具用的不多
- util.inspect
目的就是将对象转换为字符串,比如将错误信息更加美观的展示在控制台,就可以自定义,但是可以直接用chalk模块在实现这个美化控制台输出的工作。
'use strict';
const chalk = require('chalk');
module.exports = {
info(...args) {
const prefix = chalk.green('[INFO]');
args.unshift(prefix);
console.log.apply(console, args);
},
warn(...args) {
const prefix = chalk.yellow('[WARNING]');
args.unshift(prefix);
console.log.apply(console, args);
},
error(...args) {
const prefix = chalk.red('[ERROR]');
args.unshift(prefix);
console.log.apply(console, args);
},
};
out.info(`Current yuque-hexo-lyrics version is ${chalk.yellow(pkg.version)}, and the latest version is ${chalk.green(update.latest)}. Please update!`);
out.info('View more detail: https://github.com/wztlink1013/yuque-hexo-lyrics#changelog');
Node.js三方模块
第三方模块的两种存在形式:
- 以js文件的形式存在,提供实现项目具体功能的API接口。
比如使用jQuery,html中引入CDN超链接即可使用。
- 以命令行工具形式存在,辅助项目开发。
比如VUE-CLI工具。
npm是用来管理模块的一个node工具,它会伴随着node的下载而一同下载。
node生态的繁荣多益于很多优秀的三方模块的存在,具体可以查看 NoderSurvey 2021 年度报告 的相关统计与调研。在此记录一下在学习以及实际开发过程中自己所学习到的三方模块,特别地,express三方模块是一个web应用框架,需要学习的点较多,单独拿出来详细学习。
cnpm+淘宝镜像
因为npm是处于国外的服务器,下载模块有时候可能会较慢,特别是文件比较多的模块。以下是临时使用淘宝镜像下载的命令。
npm --registry https://registry.npm.taobao.org install
如果不想改变npm源,也可以直接使用cnpm(推荐)
// 安装cnpm命令,不会改变npm的源
npm install -g cnpm --registry=https://registry.npm.taobao.org
//使用
cnpm install
//查看源,可以看到设置过的所有的源
npm config get registry
- 参考:https://www.cnblogs.com/sese/p/9297028.html
nodemon模块
作用:在开发过程中,修改了文件,控制台命令行就会根据文件的修改自动运行cnpm install nodemon –g
使用方法:将运行命令中的node换成nodemongulp模块
基于node平台开发的前端构建工具,将机械化操作编写成任务,想要执行机械化操作时执行一个命令行命令任务就能自动执行了,用机器代替手工,提高开发效率。
具体的还有webpack,后续继续学习。
作用:
- 项目上线,HTML、CSS、JS文件压缩合并
- 语法转换(es6、less …)
- 公共文件抽离
- 修改文件浏览器自动刷新
glup本身提供的api函数很少,官网到目前更新只有下面几个,具体使用方法,使用的时候去查
gulp生态也有很多插件,根据插件下载相应需要的功能插件
- gulp-htmlmin :html文件压缩
- gulp-csso :压缩css
- gulp-babel :JavaScript语法转化
- gulp-less: less语法转化
- gulp-uglify :压缩混淆JavaScript
- gulp-file-include 公共文件包含
- browsersync 浏览器实时同步
ws模块
ws(GitHub地址)是Node.js的npm实现,以便在项目中使用。
什么是WebSocket?
WebSocket是一个长连接,客户端可以给服务端发送消息,服务端也可以给客户端发送消息,两者频繁的发送消息,全双工通信模式。
参考:https://blog.csdn.net/LiMubai_CN/article/details/81844156
cross-env模块
windows不支持NODE_ENV=development的设置方式
所以使用该模块来进行跨平台地使用环境变量,兼容各平台使用
sharedb模块
ShareDB 是一个整合了前后端的 OT 框架,可以很方便地自行搭建服务端和客户端。框架基于 Node.JS 实现。
OT(Operational transformation)是一种支持高级协作软件系统中的一系列协作功能的技术。OT 最初是为了在纯文本文档的协作编辑中实现一致性维护和并发控制而发明的。它的功能已得到扩展,其应用程序已扩展至包括组撤消、锁定、冲突解决、操作通知和压缩、组感知、HTML/XML 和树状结构文档编辑、协作办公生产力工具、应用程序共享和协作计算机- 辅助媒体设计工具。[1] 2009 年,OT 被采用为Apache Wave协作功能背后的核心技术和谷歌文档。
sharedb-mongo模块
uuid模块
生成唯一的一个字符串
- v3:基于名字的 用相同的名字,会生成相同的uuid出来
- 官网配置教程:https://editor.aomao.com/zh-CN/config/ot
运行方式:将
ot-server
文件夹复制到项目根目录,将其处于运行状态,然后再运行主项目(localhost实质上就是指向127.0.0.1这个本地IP地址。)使用nanoid模块生成随机路径
因为uuid生成的字符串太长,不便于作为url路径使用,所以使用nanoid来作为随机url路径
https://github.com/ai/nanoid/blob/HEAD/README.zh-CN.md
Node.js异步的解决策略
参考:
传统的解决方案:async await等
- 嵌套使用