Поддержка nodejs
Введение
Вы можете разрабатывать клиентские приложения с использованием nodejs любым способом, который Вам подходит и с использованием любых технологий. Все что необходимо в проекте - это подключить собранное frontend-приложение в качестве статических ресурсов.
В этом случае, дальше можете не читать.
Однако, в случае, когда ваше приложение состоит из нескольких модулей nodejs, которые разрабатываются отдельно и зачастую лежат в разных репозиториях, удобно иметь возможность использовать такие модули напрямую из исходников, пропуская этап публикации их в реестр npm, локальный или основной.
Для этих случаев существуют различные механизмы и утилиты. Например workspaces в npm, или проект lerna. По разными причинам они не подходят полностью. Поэтому в Jandcode Core имеется свой простой взгляд на многомодульную разработку на nodejs.
Суть
У Вас имеется набор модулей nodejs, которые могут находится как в репозитории проекта, так и вне него, например в другом репозитории.
Каждый модуль nodejs располагается в отдельном каталоге и имеет в корне
файл package.json
с описанием модуля. Имя модуля указывается в package.json
и оно
уникально среди всех остальных используемых модулей. Имя модуля можно использовать в
виде @mycompany/mymodule
. Тут все стандартно.
Каждый модуль может иметь зависимости, указанные в package.json
. Тут тоже все
стандартно.
В файле проекта project.jc
Вы указываете, где расположены модули nodejs, которые
необходимо использовать в проекте. Таким образом собирается реестр модулей в исходниках.
Если модуль в исходниках зависит от другого модуля в исходниках, то такую зависимость
нужно указывать в разделе optionalDependencies
:
{
"name": "@mycompany/mymodule1",
"version": "1.0.0",
"optionalDependencies": {
"@jandcode/apx": "^1.0.0"
}
}
Это нужно для того, что бы npm не устанавливал их сам, т.к. они отсутствуют в реестре npm.
Для собранного реестра модулей собираются все не опциональные зависимости и формируется единый список зависимостей. Для этого списка зависимостей формируется скрытый модуль nodejs. Для него устанавливаются все зависимости с использованием npm.
Формируется особая среда в переменных nodejs NODE_PATH
и NODE_OPTIONS
, в которой
модули в исходниках будут доступны node по своим именам.
После этого в каталоге приложения можно выполнять node и любые команды
из node_modules/.bin
, предваряя их префиксом jc @
, например jc @ node
, jc @ webpack
.
Все модули в исходниках будут доступны в node и webpack по своим именам, наряду с
модулями, установленными в node_modules
.
Настройка
Пример:
import jandcode.core.nodejs.jc.*
import jandcode.jc.*
class Project1 extends ProjectScript {
static beforeLoad = {
// ...
// подключаем инструментарий nodejs
classpath("jandcode-core-nodejs-jc")
}
void onInclude() {
// ...
// подключаем поддержку nodejs
include(NodeJsRootProject).with {
// добавляем модули
modules(
// как каталог, который содержит package.json
"./frontend",
// как маску для файлов package.json
"./js-modules/*/package.json",
)
/* указываем в каком каталоге располагается главный модуль,
результаты сборки которого будут подключены как ресурсы в приложение */
mainModule = "./frontend"
}
}
}
mainModule
Главный модуль имеет важное отличие от всех остальных.
Он используется для сборки frontend приложения. Собирать приложение он должен в
каталог _gen
в корне главного модуля. Каталог _gen
будет подключен к приложению в
корень виртуальной файловой системы.
Для унификации принято соглашение, что сборка осуществляется в каталог _gen/frontend
.
Команды для сборки должны быть указаны в package.json
как скрипты build
(для сборки)
и watch
(для сборки, ожидания изменения в файлах и сборки измененных).
Например:
{
"name": "jandcode-samples-jsmodules1",
"version": "1.0.0",
"description": "",
"main": "./src/index.js",
"scripts": {
"build": "webpack",
"watch": "webpack -w"
}
}
Сборка проекта
Сборка проекта jc build
дополнительно вызывает сборку главного модуля.
Системные каталоги и файлы
Системные каталоги, используемые для nodejs:
_jc/nodejs-nm-holder
- в этом каталоге находится сгенерированныйpackage.json
, в который помещены все зависимости npm. В нем же -node_modules
, который получен из этих зависимостей. Этотnode_modules
и используется как единая точка разрешения зависимостей для всех модулей._jc/nodejs-prepare
- в этом каталоге сгенерированные файлы для поддержки среды nodejs_jc/jc-env.bat
- в этот файл генерируются переменные среды для поддержки среды nodejs_jc/nodejs-prepare/webpack-dummy.config.js
- в этом файле сгенерирована конфигурация webpack, которую использует IDEA для определения какие модули где лежат, что бы работали ее подсказки_jc/nodejs-prepare/jc-nodejs-modules.js
- это сгенерированный файл, в котором определены все подключенные модули nodejs в исходниках. Подключение этого файла в любой js-файл настроит среду исполнения nodejs так, что бы она видела модули в исходниках как родные
Команды jc
prepare
Стандартная команда prepare
расширена настройкой среды nodejs и установки зависимостей
npm. Когда добавляете/удаляете/изменяете зависимости, выполните jc prepare
или jc gen-idea
.
nodejs-build
Собрать проект mainModule. Фактически команда запускает jc @ npm run build
в каталоге
главного модуля.
nodejs-watch
Собрать проект mainModule и ожидать изменения в файлово системе. Фактически команда
запускает jc @ npm run watch
в каталоге главного модуля.
nodejs-showlibs
Показывает все модули nodejs, подключенные к проекту.
nodejs-showdeps
Показывает все зависимости npm, которые используются в проекте.