Поддержка nodejs

Связи
  • jandcode-core-nodejs-jc (lib)

Введение

Вы можете разрабатывать клиентские приложения с использованием 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, которые используются в проекте.