Привет вам, ребята! Я надеюсь, что у вас все в порядке, сегодня я попытаюсь объяснить, как мы можем интегрировать Rust с Nodejs, и я подумал, что этот пример будет хорошей идеей.
Если у вас нет знаний о Rust, не беспокойтесь, этот пост будет действительно прост для понимания, и я думаю, что он даст вам представление об этом фантастическом языке программирования.
Прежде всего, нам нужно создать наш проект, это будет минимальный проект, в данном случае мы собираемся создать alarm в качестве примера, вы должны будете установить rust и nodejs, прежде чем перейти к дальнейшему эксперименту.
Поехали!!!
Создаём новый проект
Мы собираемся создать нашу основу, внутри вашей пустой папки мы выполним команду:
Это создаcт ваш пустой проект rust.
После этого мы собираемся создать наш пустой проект nodejs с помощью этой команды:
Затем нам нужно установить пакет, который поможет нам создать наш rust-код и переместить библиотеку по определенному пути (в данном случае это будет корневой путь нашего проекта).
Применение конфигурации
Для обеспечения связи между нашим проектом `nodejs` и нашей библиотекой `rust` нам необходимо установить neon, этот модуль дает нам возможность создать привязку между нашими двумя проектами. Вы можете добавить в наш `Cargo.toml`, которая выглядела бы следующим образом:
если вы хотите узнать больше о `Cargo.toml`, я настоятельно рекомендую вам ознакомиться с форматом манифеста.
Этого было достаточно для нашей конфигурации rust, давайте перейдем к нашей конфигурации проекта nodejs, в наш `package.json` мы можем добавить наш процесс сборки, для хорошей практики я собираюсь поместить его в раздел нашего сценария сборки:
Эта команда позволяет нам скомпилировать нашу библиотеку с помощью `cargo build` и переместить двоичный файл в корневой каталог с именем `index.node`.
Очень важно иметь одинаковое имя в обоих проектах, поэтому имя в нашем package.json будет:
Добавление логики
Я собираюсь добавить весь код для нашего проекта rust, а затем я объясню, как это работает.
В наш `src/lib.rs` мы можем добавить этот код:
и в нашем `test.js` файл (вы можете назвать его как хотите):
Ладно! Теперь пришло время объяснить наш код.
Давайте посмотрим нашу основную функцию:
В этой части мы объявляем наш модуль, если вы работаете с nodejs, а также с браузером, вы можете объявить несколько модулей (commonjs, esm и т.д.), Которые представляют собой изолированные блоки кода, которые мы можем импортировать для его использования. Что ж, как вы можете видеть, мы объявили этот блок кода:
Для простоты мы можем прочитать это как “Я объявляю метод alarm и экспортирую его, а позже мы сможем использовать его для любого модуля, который мы хотим импортировать в нашем коде nodejs.
Теперь давайте проверим наш код alarm-а:
В этом месте:
Мы получаем два первых параметра нашей функции, вы помните это? Я напомню:
Как вы видите, у нас есть два параметра, и в нашем коде rust мы получаем эти значения, первое - числовое значение, а второе - функция (наш обратный вызов), также важно отметить, что у нас есть:
Это важно, потому что дает нам возможность взаимодействовать с eventloop (по сути, основным потоком нашего приложения nodejs).
И здесь происходит волшебство:
Я уже говорил о eventloop раньше, не так ли? Как разработчик, вы должны знать, что мы не можем заблокировать наш eventloop из-за того, что мы создаем новый поток (это только для нашего примера, если вы хотите иметь несколько потоков, вы можете использовать rayon и т.д.). Итак, в нашей логике мы переводим поток в спящий режим на время, которое мы передали в нашем первом аргументе, а затем мы вызываем наш обратный вызов, в данном случае это будет простой обратный вызов с нулевым аргументом (значение ошибки).
Теперь пришло время протестировать наше решение!
Сначала нам нужно создать наш rust-код, мы можем сделать это с помощью команды:
После этого мы собираемся протестировать наше приложение nodejs:
node test.js
и бум!
Самая важная часть нашего вывода заключается в том, что мы не блокируем наш eventloop!
Я надеюсь, что этот пост будет полезен для вас!
Статья на list-site.