create-single-spa
Single-spa предлагает утилиту командной строки (CLI) для тех, кто предпочитает автогенерацию и управление конфигурациями webpack, babel, jest и т.д. Использование CLI для работы с single-spa необязательно.
Утилита командной строки называется create-single-spa
(ссылка на Github). Она в первую очередь предназначена для создания новых проектов, но также может быть полезна для миграции существующих проектов (особенно миграции CRA или проектов без фреймворков).
Установка и использование
Если вы желаете иметь create-single-spa глобально доступным, запустите следующую команду в терминале:
npm install --global create-single-spa# oryarn global add create-single-spa
Затем запустите следующее:
create-single-spa
Альтернативно, вы можете использовать create-single-spa без глобальной установки:
npm init single-spa# илиnpx create-single-spa# илиyarn create single-spa
Откроется диалоговое окно CLI, спрашивающее вас, какого типа проект вы хотите создать или обновить.
CLI аргументы
Вы можете передать аргументы в create-single-spa, такие как:
# Разные пути для получения одного результатаcreate-single-spa --framework reactnpm init single-spa --framework reactnpx create-single-spa --framework reactyarn create single-spa --framework react
Ниже представлены доступные опции CLI:
--dir
Вы можете указать, в каком каталоге запустить create-single-spa одним из следующих способов:
# Два пути для получения одного результатаcreate-single-spa my-dircreate-single-spa --dir my-dir
--moduleType
Вы можете указать, какой тип микрофронтенда вы создаете с помощью CLI аргумента --moduleType
:
create-single-spa --moduleType root-configcreate-single-spa --moduleType app-parcelcreate-single-spa --moduleType util-module
--framework
Вы можете указать, какой фреймворк вы используете с помощью CLI аргумента --framework
. Обратите внимание, что если вы укажете фреймворк, то можете опустить --module Type
, так как предполагается, что это app-parcel
.
create-single-spa --framework reactcreate-single-spa --framework vuecreate-single-spa --framework angular
--layout
При создании корневой конфигурации CLI аргумент `--layout ' указывает, что вы хотите использовать single-spa-layout в корневой конфигурации.
Типы проектов
create-single-spa спрашивает вас, хотите ли вы создать single-spa приложение, служебный модуль или корневую конфигурацию. Все три типа модулей предполагают, что вы используете рекомендуемую настройку.
Если вы выберете, что хотите создать single-spa приложение, вам будет предложено выбрать фреймворк. React создается с предварительно сделанными настройками babel + webpack + jest. Angular создается с Angular CLI и single-spa-angular. Vue создается с Vue CLI и vue-cli-plugin-single-spa.
NPM packages
В репозитории create-single-spa есть несколько пакетов NPM. В следующих разделах описывается каждый из пакетов:
create-single-spa
Корневой CLI, который вызывает generator-single-spa.
generator-single-spa
Yeoman generator который спрашивает юзера и потом создает файлы. Это в первую очередь вызывается с create-single-spa CLI, но так же может быть составлено если вы хотите его настроить.
webpack-config-single-spa
Разделяемая, настраиваемая конфигурация webpack, которая используется для служебных модулей и single-spa приложений.
Установка
npm install --save-dev webpack-config-single-spa webpack-merge# илиyarn add --dev webpack-config-single-spa webpack-merge
Использование
const webpackMerge = require('webpack-merge');const singleSpaDefaults = require('webpack-config-single-spa');module.exports = (webpackConfigEnv, argv) => {const defaultConfig = singleSpaDefaults({// Имя организации, для которой написано приложениеorgName: 'name-of-company',// Имя текущего проекта. Это обычно совпадает с именем git репозитория.projectName: 'name-of-project',// Смотреть https://webpack.js.org/guides/environment-variables/#root для объяснения webpackConfigEnvwebpackConfigEnv,// Команды CLI в скрипте package.json, который вызвал эту сборкуargv,// Опционально// Будут ли имена пакетов, начинающиеся с @имя-вашей-компании рассматриваться как внешние объекты иои нет. По умолчанию выставлено trueorgPackagesAsExternal: true,})return webpackMerge.smart(defaultConfig, {// Если вы хотите модифицировать webpack конфиг, настройки добавлять к этому объекту})}
webpack-config-single-spa-react
Разделяемая, настраиваемая конфигурация webpack которая добавляет react-специфичную конфигурацию к webpack-config-single-spa
.
Установка
npm install --save-dev webpack-config-single-spa-react webpack-merge# илиyarn add --dev webpack-config-single-spa-react webpack-merge
Использование
const webpackMerge = require('webpack-merge');const singleSpaDefaults = require('webpack-config-single-spa-react');module.exports = (webpackConfigEnv, argv) => {const defaultConfig = singleSpaDefaults({// Имя организации, для которой написано приложениеorgName: 'name-of-company',// Имя текущего проекта. Это обычно совпадает с именем git репозитория.projectName: 'name-of-project',// Смотреть https://webpack.js.org/guides/environment-variables/#root для объяснения webpackConfigEnvwebpackConfigEnv,// Команды CLI в скрипте package.json, который вызвал эту сборкуargv,// Опционально// Будут ли имена пакетов, начинающиеся с @имя-вашей-компании рассматриваться как внешние объекты иои нет. По-умолчанию выставлено trueorgPackagesAsExternal: true,})return webpackMerge.smart(defaultConfig, {// Если вы хотите модифицировать webpack конфиг, настройки добавлять к этому объекту})}
webpack-config-single-spa-ts
Разделяемая, настраиваемая конфигурация webpack которая добавляет typescript-специфичную конфигурацию к webpack-config-single-spa
. Обратите внимание, что webpack-config-single-spa-ts имеет peerDependency от typescript
.
Установка
npm install --save-dev webpack-config-single-spa-ts webpack-merge# oryarn add --dev webpack-config-single-spa-ts webpack-merge
Использование
const webpackMerge = require('webpack-merge');const singleSpaDefaults = require('webpack-config-single-spa-ts');module.exports = (webpackConfigEnv, argv) => {const defaultConfig = singleSpaDefaults({// Имя организации, для которой написано приложениеorgName: 'name-of-company',// Имя текущего проекта. Это обычно совпадает с именем git репозитория.projectName: 'name-of-project',// Смотреть https://webpack.js.org/guides/environment-variables/#root для объяснения webpackConfigEnvwebpackConfigEnv,// Команды CLI в скрипте package.json, который вызвал эту сборкуargv,})return webpackMerge.smart(defaultConfig, {// Если вы хотите модифицировать webpack конфиг, настройки добавлять к этому объекту})}
const singleSpaTs = require('webpack-config-single-spa-ts');// Алтерьнативно, вы можете модифицировать webpack конфиг напрямуюconst myOtherWebpackConfig = {/* ... */}const finalConfig = singleSpaDefaults.modifyConfig(myOtherWebpackConfig)
webpack-config-single-spa-react-ts
Разделяемая, настраиваемая конфигурация webpack которая создает webpack конфиг, работающий с react и typescript. Обратите внимание, что webpack-config-single-spa-react-ts просто мержит конфиг из webpack-config-single-spa-react с webpack-config-single-spa-ts.
Установка
npm install --save-dev webpack-config-single-spa-react-ts webpack-merge# oryarn add --dev webpack-config-single-spa-react-ts webpack-merge
Использование
const webpackMerge = require('webpack-merge');const singleSpaDefaults = require('webpack-config-single-spa-react-ts');module.exports = (webpackConfigEnv, argv) => {const defaultConfig = singleSpaDefaults({// Имя организации, для которой написано приложениеorgName: 'name-of-company',// Имя текущего проекта. Это обычно совпадает с именем git репозитория.projectName: 'name-of-project',// Смотреть https://webpack.js.org/guides/environment-variables/#root для объяснения webpackConfigEnvwebpackConfigEnv,// Опционально// Будут ли имена пакетов, начинающиеся с @имя-вашей-компании рассматриваться как внешние объекты иои нет. По-умолчанию выставлено trueorgPackagesAsExternal: true,// Команды CLI в скрипте package.json, который вызвал эту сборкуargv,})return webpackMerge.smart(defaultConfig, {// Если вы хотите модифицировать webpack конфиг, настройки добавлять к этому объекту})}
single-spa-web-server-utils
Пакет single-spa-web-server-utils
представляет собой набор функций, которые помогают при реализации веб-сервера для index.html файла. Этот пакет можно использовать для встроенного import maps в HTML, что помогает повысить производительность вашего приложения. Кроме того, он может быть использован для изменения import map браузера так, что он подходит для использования в NodeJS для динамической загрузки модулей и серверного рендеринга (Динамическая загрузка модулей и Серверный рендеринг)).
Утилиты веб-сервера периодически запрашивают import map из URL и генерируют browserImportMap
и nodeImportMap
из ответа.
Установка
npm install --save single-spa-web-server-utils# илиyarn add single-spa-web-server-utils
getImportMaps
Функция getImportMaps
принимает в параметр объект и возвращает промис, который завершается объектом с двумя import maps: browserImportMap
и nodeImportMap
.
const { getImportMaps } = require('single-spa-web-server-utils');const http = require('http');const ejs = require('ejs');const fs = require('fs');const path = require('path');const htmlTemplate = ejs.compile(fs.readFileSync(path.resolve(process.cwd(), 'views/index.html'), 'utf-8'));http.createServer((req, res) => {getImportMaps({// Обязательно// URL на котором расположен серверurl: 'https://my-cdn.com/live.importmap',// Опционально - по-умолчанию 30000// Задержка опроса сервером import map в миллисекундахpollInterval: 30000,// Опционально - по-умолчанию false// Следует ли разрешить import-map-overrides с помощью файлов cookie, отправленных в запросе.// Больше деталей о переопределении с cookie здесь:// https://github.com/joeldenning/import-map-overrides/blob/master/docs/api.md#nodeallowOverrides: true,// Опционально - необходимо только тогда, когда allowOverrides true// Входящее сообщение от http-сервера. Используется, чтобы собрать cookies для import-map-overridesreq,// Опционально// Это позволяет удалить записи из загруженной import map из возвращенной "nodeImportMap".// Это полезно для настройки import map, используемой в браузере,// чтобы ее можно было использовать для динамической загрузки модуля NodeJS.// Каждый ключ представляет собой заданную строку импорта.// Ключи, для которых вы возвращаете `true`, сохраняются в nodeImportMap.nodeKeyFilter(key) {return true;}}).then(({browserImportMap, nodeImportMap}) => {console.log(browserImportMap, nodeImportMap);// Пример того, как встроить import map браузераconst htmlWithInlinedImportMap = htmlTemplate({importMap: browserImportMap});res.setResponseHeader('Content-Type', 'text/html');res.status(200).send(htmlWithInlinedImportMap);// Пример того, как применить NodeJS import map// Больше информации тут: https://github.com/node-loader/node-loader-import-mapsglobal.nodeLoader.setImportMapPromise(Promise.resolve(nodeImportMap));import('module-in-import-map');});});