Автор последовательно взял на себя несколькоnodejs
Проект, также участвовал в нескольких битах среднегоnodejs
Проект с открытым исходным кодом, я недавно разобрался с некоторыми проблемами и решениями, встречающимися в нем, дабы не дать всем впредь наступить на яму. Начнем, не говоря об этом~
1. Проблема установки переменной NODE_ENV под windows и mac
Все мы знаем, что во фронтенд-проектах будет обрабатываться разная логика в соответствии с разными переменными окружения.nodejs
Точно так же нам нужно установить локальную среду разработки, тестовую среду, онлайн-среду и т. д. В настоящее время существует решение всегда устанавливать переменные среды вpackage.json
серединаscript
свойства следующим образом:
"scripts": {
"start": "export NODE_ENV=development && nodemon -w src --exec \"babel-node src\"",
"build": "babel src --out-dir dist",
"run-build": "node dist",
"test": "echo \"Error: no test specified\" && exit 1"
}
отstart
В инструкции мы можем найти, что мы используемexport NODE_ENV=development
Чтобы определить переменные среды среды разработки, поскольку автор используетmac
компьютер, такexport
определитьnode
Переменные среды.Но при разработке проекта с другом я обнаружил, что реализацияyarn start
Об ошибке будет сообщено позже, и сообщение об ошибке будет найдено позжеwindow
не опознаноexport
, позже я нашелwindow
Чтобы определить переменные среды, вы можете использоватьset
, Таким образом, дляwindow
пользователя, если вы используете описанный выше метод для установкиNODE_ENV
, можно использовать следующим образом:
"scripts": {
"start": "set NODE_ENV=development && nodemon -w src --exec \"babel-node src\""
}
2. Проблема ошибки node-gyp при выполнении npm install
В процессе разработки проекта иногда тянуть новыеnode
Выполнить после кода проектаnpm install
, сообщит о следующей ошибке:
node-gyp
только что вnode
Файлы проекта, используемые в среде для создания разных компиляторов для разных платформ, если вы столкнулись с одной и той же проблемой, мы можем использовать следующие решения:
npm install -g node-gyp
или просто удалитьpackage-lock.json
илиyarn.lock
, а затем повторноyarn install
илиnpm install
Все, явный тест автора эффективен.
3. Решение для удаления установленного файла cookie в проекте node + koa2.
Поскольку HTTP является протоколом без сохранения состояния, файлы cookie необходимы для различения пользователей. Мы можем думать о файлах cookie как о спецификации, реализуемой браузером и сервером вместе.
cookie
Обработка разделена на следующие три шага (Базовые и важные знания):
- Сервер отправляет клиенту
cookie
- браузер будет
cookie
Сохранить (вы можете установить expires или maxAge в бэкэнде наsession
форма есть) - Каждый раз браузер будет устанавливать ранее установленное
cookie
отправить на сервер
в разработкеnode
Мы часто включаем модули управления пользователя в фоновых проектах, что означает, что нам нужносостояние входауправление, которое может удалять данные пользователя вовремя, когда пользователь выходит из системыcookie
, к счастьюkoa2
идет с обработкойcookie
метод, мы можем установить его следующим образомcookie
:
router.post(api.validVip,
async ctx => {
ctx.cookies.set('vid', 'xuxiaoxi', { maxAge: 24 * 3600 * 1000 });
}
);
Выше мы произвольно установили срок действия 1 день.cookie
Тогда, если бизнес изменяется, вам нужно очистить этоcookie
?, Как мы справляемся с этим дает решения для решения относительно доступных:
ctx.cookies.set('vid', '', { maxAge: 0 });
В это время у клиентаcookie
Автоматически истечет при следующем запросе.
4. Как socket.io работает с koa/egg
мы все знаем полнуюsocket.io
Коммуникация состоит из двух частей:
- а такжеNodeJS HTTPСервер интеграции (или установленный на нем)socket.io
- Клиентская библиотека загружается на стороне браузераsocket.io-client
Если мы непосредственно используем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);
// 正常的业务处理
// io
io.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
Инструмент управления пакетами (n) для перехода на адаптированныйnode
версии, следующим образом:
// 更新最新的包
npm i xxx@latest
// 使用包管理工具n
npm i -g n
использоватьnМожно легко управлятьnode
версии, вы можете попробовать, если вам интересно.
6. Как создавать запланированные задачи в nodejs
Запланированные задачи — одна из распространенных функций в бэкенд-разработке, и их суть заключается в следующем.В соответствии с временными правилами система автоматически выполняет соответствующие задачи в фоновом режиме.. существуетjava
, PHP
Существует богатая поддержка запланированных задач на фоновых языках, таких какnodejs
Для этой восходящей звезды, хотя у нее нет такой зрелой экосистемы, у нее все еще есть модули для задач на время, таких какnode-schedule
.
Node Schedule— это гибкий планировщик заданий, похожий на cron и не похожий на cron, для Node.js. Это позволяет нам планировать задания (произвольные функции) для выполнения в определенные даты, используя необязательные правила повторения. Он использует только один таймер в любой момент времени (вместо переоценки предстоящих заданий каждую секунду/минуту).
Очень практичный сценарий состоит в том, что мы хотим, чтобы ежегодный выпуск Double Eleven или Double Twelvenode
Программа автоматически захватывает "товарную вату" интернет-бизнеса и отправляет ее в свой почтовый ящик. В это время мы можем использоватьNode Schedule
Чтобы запустить временную задачу для выполнения наших бизнес-операций, многие из авторскихnode
Все приложения используют схожую модель, если вам интересно, вы можете общаться друг с другом.
что это такоеcron
Как насчет планирования в стиле?github
Краткое введение приведено выше:
Таким образом, мы можем написать запланированную задачу следующим образом:
let schedule = require('node-schedule');
let testJob = schedule.scheduleJob('42 * * * *', function(){
console.log('将在未来的每个时刻的42分时执行此代码, 比如22:42, 23:42');
});
7. Используйте синтаксис импорта, экспорта и декоратора @decorator в проекте nodejs.
мы все знаем сейчас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. Элегантно обрабатывать файлы json в nodejs и улучшать производительность чтения и записи json.
дляnodejs
На самом деле, в плане оптимизации можно много говорить, здесь мы в основном говорим о ней.json
Связанные решения по оптимизации.Нам нужно оптимизировать с двух сторон, одна из них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
module, в этот момент мы можем читать и анализировать файл построчно, как в следующем случае:
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
Операция также является частью оптимизации производительности узла, после такой обработки наш сайт может загружаться быстрее, мы можем использоватьkoa
изkoa-compress
промежуточное ПО для реализацииgzip
Функция Конкретная реализация выглядит следующим образом:
import koa from 'koa';
import compress from 'koa-compress';
const app = new koa();
// 开启gzip
const options = { threshold: 2048 };
app.use(compress(options));
Конечноkoa-compress
Также есть много настраиваемых элементов конфигурации, это чувствуется.
11. Решить проблему несовместимости разделителей путей в системах Windows и 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
Примерный процесс выглядит следующим образом:Я поделился многимnode
Практические проекты принятыchild_process
, общий процесс реализации выглядит следующим образом:
// child.js
function computedTotal(arr, cb) {
// 耗时计算任务
}
// 与主进程通信
// 监听主进程信号
process.on('message', (msg) => {
computedTotal(bigDataArr, (flag) => {
// 向主进程发送完成信号
process.send(flag);
})
});
// main.js
const { 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()
})
13. Редактирование/сжатие изображений на стороне узла
Редактирование и сжатие изображений распространены во многих сценариях с использованием интерфейсных технологий.node
Так же есть много картинок, которые нужно обрабатывать на стороне клиента.Ведь качество обработки на стороне клиента контролировать непросто.На данный момент мы можем использоватьnode-images
, онnode
Легкая кроссплатформенная библиотека кодеков изображений сбоку, ее основные функции заключаются в следующем:
- легкий: Нет необходимости устанавливать какую-либо библиотеку обработки изображений.
- Кроссплатформенность: Скомпилированный файл .node выпускается под Windows, и его можно использовать после загрузки.
- Простой в использовании: API в стиле JQuery, простая зависимость
Мы можем использовать его для обрезки и сжатия изображений, основное использование заключается в следующем:
const images = require("images");
images("input.jpg") //加载图像文件
.size(400) //等比缩放图像到400像素宽
.draw(images("logo.png"), 10, 10) //在(10,10)处绘制Logo
.save("output.jpg", { //保存图片到文件,图片质量为50
quality : 50
});
существуетH5-DooringВ редакторе вы также используете его для обработки и редактирования изображений, а также можете использовать его в соответствии с вашим реальным бизнесом.
14. Сторона узла анализирует «командную строку командной строки» для автоматической упаковки и развертывания проекта в Интернете.
оnode
Разобратьcmd
Перед строкой и выполните то, как я командную строку в письменной формеВнедрите автоматизированный рабочий процесс самостоятельноТакже в статье представлено использованиеchild_process
модульныйexec
, конкретная реализация может относиться к статье:
Напишите простой пример здесь:
const cmdStr = `cd ${outWorkDir} && yarn build ${fid}`
// 解析命令行指令, 实现线上自动打包构建项目
exec(cmdStr, function(err, stdout, stderr){
if(err) {
console.log('api error:'+stderr);
io.emit('htmlWorked', { result: 'error', message: stderr })
} else {
// ...
}
})
15. Как решить проблему сбоя приложения узла, балансировки нагрузки и управления процессами
Лучший способ решить эту проблему — использоватьpm2
илиforever
, что обеспечивает мощныйnode
Управление процессами, возможности балансировки нагрузки и определенный уровень мониторинга приложений рекомендуется использовать в онлайн-среде.pm2
управлять нашимnode
заявление.
найти его полезным? Добавьте в избранное, если вам это нравится, и, кстати, поставьте лайк Ваша поддержка - моя самая большая поддержка! Поиск в WeChat »Интересный разговор о фронтенде», откройте для себя больше интересных игр H5, webpack, node, gulp, css3, javascript, nodeJS, визуализацию данных на холсте и другие интерфейсные знания и реальный бой.