如果我们直接使用koa或者egg, 我们需要将它们内部集成的http和socket.io做兼容, 此时我们可以这样处理:

import koa from 'koa';import http from 'http';const app = new koa();const server = http.createServer(app.callback());const io = require('socket.io')(server);//  正常的业务处理// ioio.on('connection', (socket) => {    console.log('a user connected');    socket.on('doc load', (msg) => {      console.log('doc load', msg)      io.emit('getData', users)    })  });server.listen(3000, () => {    // ...});复制代码

通过以上的方式就可以正常的将koa和socket.io 做兼容. 后面我们就可以正常的开发IM应用啦~

5. 由于nodejs第三方模块依赖特定node版本导致的报错解决方案

这个情况笔者之前也遇到过, 主要原因是第三方没有和node版本做到很好的向后兼容, 此时解决方案就是更新此第三方包到最新版本(如果还在维护的情况), 或者使用node包管理工具(n)切换到适配的node版本, 如下:

// 更新最新的包npm i xxx@latest// 使用包管理工具nnpm i -g n复制代码

使用n可以很方便的管理node版本, 感兴趣可以尝试一下.

6. nodejs如何创建定时任务

定时任务在后端开发中是很常见的功能之一, 其本质是根据时间规则,系统在后台自动执行相应的任务. 在java, PHP 等后台语言中有很丰富的定时任务的支持, 对于nodejs 这个兴起之秀来说, 虽然没有那么成熟的生态, 但是仍然有定时任务的模块, 比如node-schedule.

Node Schedule 是用于Node.js的灵活的 cron 类和非 cron 类作业调度程序。它允许我们使用可选的重复规则来安排作业(任意函数)在特定日期执行。它在任何给定时间仅使用一个计时器(而不是每秒钟/分钟重新评估即将到来的作业)。

一个很实用的场景是我们想在每年的双十一或者双十二让node程序自动抓取某电商的“商品羊毛”, 并推送到自己的邮箱, 此时我们就可以用Node Schedule来开启一个定时任务来执行我们的业务操作, 笔者的很多node应用都采用了类似的模式.感兴趣可以互相交流一下.

那什么是cron风格的Scheduling呢? 其github上给出了一个简单的介绍:

内存条修复软件_一招修复内存不能read_内存修复

所以我们可以像如下方式这样来写一个定时任务:

let schedule = require('node-schedule');let testJob = schedule.scheduleJob('42 * * * *', function(){  console.log('将在未来的每个时刻的42分时执行此代码, 比如22:42, 23:42');});复制代码

7. 在nodejs项目中使用import, export和修饰器@decorator语法

我们都知道现在nodejs版本已经到14.0+版本了, 对最新的es语法支持的也足够好, 但是目前仍然有一些语法不支持, 比如es的模块导入导出(import, export), 装饰器(@decorator)等, 此时我们要在node项目中使用这些新特性, 我们就不得不借助工具, 这里笔者采用babel7来解决上述问题, 如下:

# .babelrc{  "presets": [    [      "@babel/preset-env",      {        "targets": {          "node": "current"        }      }    ]  ],  "plugins": [    ["@babel/plugin-proposal-decorators", { "legacy": true }],    ["@babel/plugin-proposal-class-properties", { "loose" : true }]  ]}复制代码

我们只需要在项目根目录里新建并写入如上文件, 并安装babel对应的模块即可, 如下:

yarn add @babel/cli @babel/core @babel/node @babel/plugin-proposal-class-properties @babel/plugin-proposal-decorators @babel/preset-env复制代码

此时就可以想写前端项目一样使用这些新语法特性啦~

8. nodejs中优雅的处理json文件以及提高json读写性能

对于nodejs优化方面其实有很多要聊的, 这里主要来说说json相关的优化方案. 我们需要从2个方面来优化, 一个就是json文件的读写性能, 此时我们可以采用fast-json-stringify 来大大提高json的读写速度, 其本质是提供了一套json-schema约束, 让json结构更加有序, 从而提高json的读取查询速度. 如下使用方式:

const fastJson = require('fast-json-stringify')const stringify = fastJson({  title: 'H5 Dooring Schema',  type: 'object',  properties: {    firstName: {      type: 'string'    },    lastName: {      type: 'string'    },    age: {      description: 'Age in years',      type: 'integer'    },    reg: {      type: 'string'    }  }})复制代码

比如说在H5-Dooring的后台中, 有很多需要频繁读写json数据的接口, 此时使用fast-json-stringify对读写性能会有很大的提升.

另一方面, 我们在node 端操作json, 如果用原生的写法会非常麻烦, 此时我们最好自己对json读取进行封装来提高代码的简约性, 或者我们直接使用第三方库jsonfile 来轻松读写json文件, 如下使用案例:

const json = require('jsonfile')const fileName = 'h5-dooring.json'const jsonData = jsonFile.readFileSync(fileName)复制代码

9. nodejs读取大文件报错解决方案

在nodejs中 我们可以使用两种方式来读写文件, 如下:

fs.readFile() 一次性将文件读取进内存中, 如果文件过大会导致node内存不够而报错fs.createReadStream() 以文件流的方式读取, 此时可以不用担心文件的大小

由以上介绍可知如果我们要读取的文件可能会很大(比如视频等大文件), 我们一开始就要使用fs.createReadStream(), 其实如果我们需要对文件进行解析, 比如要对简历等文件进行逐行解析提取关键语料, 我们可以使用node的readline模块, 此时我们就可以对文件进行逐行读取并解析, 如下案例:

const fs = require("fs");const path = require("path");const readline = require("readline");const readlineTask = readline.createInterface({    input: fs.createReadStream(path.join(__dirname, './h5-dooring')),}); readlineTask.on('line', function(chunk) {  // 读取每一行数据}); readlineTask.on('close', function() {  //文件读取结束的逻辑}复制代码

10. nodejs如何开启gzip优化网站性能

对于nodejs开启gzip 的操作也属于node性能优化的一部分, 经过这样的处理可以让我们的网站加载更快, 我们可以使用koa的koa-compress中间件来实现gzip 功能. 具体实现如下:

import koa from 'koa';import compress from 'koa-compress';const app = new koa();// 开启gzipconst options = { threshold: 2048 };app.use(compress(options));复制代码

当然koa-compress还有很多自定义的配置项, 大家可以感受一下.

11. 解决window和linux系统下路径分隔符不一致的问题

这个问题也是系统之间的差异导致的, 也是需要考虑的问题, 我们都知道在linux系统下路径的分隔符为/, 比如h5-dooring/src/pages, 但是在window下解析的可能就是h5-dooring\src\pages这样的路径, 此时我们需要做适配, 不然我们部署到不同系统上报错是必然的, 所以我们需要全局配置路径通配符, 笔者的解决方案如下:

import os from 'os'const _$ = (os.platform().toLowerCase() === 'win32') ? '\' : '/';复制代码

此时涉及到具体路径的地方我们用_$ 代替即可, 以上代码我们用到了node的os模块, 感兴趣的可以研究一下, 我们可以用os模块处理很多有意思的因为系统差异导致的问题.

12. nodejs如何实现父子进程通信

由于nodejs是单线程的, 但是有时候我们需要支持处理多个进程的业务, 目前nodejs可以通过哦父子进程的模式来模拟多进程, 我们可以用到child_process, 大致流程如下:

内存条修复软件_一招修复内存不能read_内存修复

笔者之前分享的很多node实战项目都采用了child_process, 大致实现过程如下:

// child.jsfunction computedTotal(arr, cb) {    // 耗时计算任务}// 与主进程通信// 监听主进程信号process.on('message', (msg) => {  computedTotal(bigDataArr, (flag) => {    // 向主进程发送完成信号    process.send(flag);  })});// main.jsconst { fork } = require('child_process');app.use(async (ctx, next) => {  if(ctx.url === '/fetch') {    const data = ctx.request.body;    // 通知子进程开始执行任务,并传入数据    const res = await createPromisefork('./child.js', data)  }    // 创建异步线程  function createPromisefork(childUrl, data) {    // 加载子进程    const res = fork(childUrl)    // 通知子进程开始work    data && res.send(data)    return new Promise(reslove => {        res.on('message', f => {            reslove(f)        })    })    }    await next()})复制代码

限时特惠:本站每日持续更新5-20节内部创业项目课程,一年会员
只需199元,全站资源免费下载点击查看详情
站长微信:
jjs406

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注