Создание авторских слоев Nuxt
Слои Nuxt - это мощная возможность, которую вы можете использовать для совместного использования и переиспользования частичных приложений Nuxt в монорепозитории или из git-репозитория или пакета npm. Структура слоев практически идентична стандартному приложению Nuxt, что упрощает их создание и поддержку.
Базовая директория слоев Nuxt должена содержать файл nuxt.config.ts
, указывающий на то, что это слой.
export default defineNuxtConfig({})
Кроме того, некоторые другие файлы в директории слоя будут автоматически сканироваться и использоваться Nuxt для проекта, расширяющего этот слой.
components/*
- Расширение компонентов по умолчаниюcomposables/*
- Расширение композаблов по умолчаниюlayouts/*
- Расширение лэйаутов по умолчаниюpages/*
- Расширение страниц по умолчаниюplugins/*
- Расширение плагинов по умолчаниюserver/*
- Расширение серверных эндпоинтов и middleware по умолчаниюutils/*
- Расширение утилит по умолчаниюnuxt.config.ts
- Расширение конфигурации nuxt по умолчаниюapp.config.ts
- Расширение конфигурации приложения по умолчанию
Базовый пример
export default defineNuxtConfig({
extends: [
'./base'
]
})
Начальный шаблон
Для начала вы можете инициализировать слой с помощью шаблона Nuxt Layer Starter. Это создаст базовую структуру, на которую вы сможете опираться. Для начала выполните эту команду в терминале:
npx nuxi init --template layer nuxt-layer
Следуйте инструкциям в README для выполнения следующих шагов.
Публикация слоев
Вы можете публиковать и делиться слоями, используя либо удаленный источник, либо npm-пакет.
Git-репозиторий
Вы можете использовать git-репозиторий, чтобы поделиться своим слоем Nuxt. Некоторые примеры:
export default defineNuxtConfig({
extends: [
'github:username/repoName', // Удаленный источник GitHub
'github:username/repoName/base', // Удаленный источник GitHub в директории /base
'github:username/repoName#dev', // Удаленный источник GitHub из ветки dev
'github:username/repoName#v1.0.0', // Удаленный источник GitHub с тегом v1.0.0
'gitlab:username/repoName', // Пример удаленного источника GitLab
'bitbucket:username/repoName', // Пример удаленного источника Bitbucket
]
})
GIGET_AUTH=<token>
для предоставления токена.GIGET_GITHUB_URL=<url>
или GIGET_GITLAB_URL=<url>
- или напрямую настроить его с помощью опции auth
в вашем nuxt.config
.install: true
в опциях слоя.export default defineNuxtConfig({
extends: [
['github:username/repoName', { install: true }]
]
})
Пакет npm
Вы можете опубликовать слои Nuxt в виде пакета npm, содержащего файлы и зависимости, которые вы хотите расширить. Это позволит вам поделиться конфигурацией с другими, использовать ее в нескольких проектах или в частном порядке.
Для расширения из пакета npm необходимо убедиться, что модуль опубликован в npm и установлен в проект пользователя как devDependency
. Затем вы можете использовать имя модуля для расширения текущей конфигурации nuxt:
export default defineNuxtConfig({
extends: [
// скоуп node модуля
'@scope/moduleName',
// или просто имя модуля
'moduleName'
]
})
Чтобы опубликовать директорию слоя как пакет npm, необходимо убедиться, что в файле package.json
указаны правильные свойства. Это обеспечит включение файлов при публикации пакета.
{
"name": "my-theme",
"version": "1.0.0",
"type": "module",
"main": "./nuxt.config.ts",
"dependencies": {},
"devDependencies": {
"nuxt": "^3.0.0"
}
}
dependencies
. Зависимость nuxt
и все, что используется только для тестирования слоя перед публикацией, должны оставаться в поле devDependencies
.Теперь вы можете приступить к публикации модуля на npm - как публично, так и приватно.
Советы
Относительные пути и алиасы
При импорте с использованием алиасов (таких как ~/
и @/
) в компонентах слоя и композаблах следует учитывать, что алиасы разрешаются относительно путей к проекту пользователя. В качестве обходного пути вы можете использовать относительные пути для их импорта. Мы работаем над лучшим решением для именованных алиасов слоя.
Также при использовании относительных путей в файле nuxt.config
слоя (за исключением вложенных extends
) они разрешаются относительно проекта пользователя, а не слоя. В качестве обходного пути используйте полные разрешенные пути в nuxt.config
:
import { fileURLToPath } from 'url'
import { dirname, join } from 'path'
const currentDir = dirname(fileURLToPath(import.meta.url))
export default defineNuxtConfig({
css: [
join(currentDir, './assets/main.css')
]
})
Многослойная поддержка модулей Nuxt
Вы можете использовать внутренний массив nuxt.options._layers
для поддержки пользовательской многослойной обработки ваших модулей.
export default defineNuxtModule({
setup(_options, nuxt) {
for (const layer of nuxt.options._layers) {
// Вы можете проверить существование пользовательской директории, чтобы расширить ее для каждого слоя
console.log('Пользовательское расширение для', layer.cwd, layer.config)
}
}
})
Примечания:
- Более ранние элементы в массиве
_layers
имеют более высокий приоритет и переопределяют более поздние - Проект пользователя является первым элементом в массиве
_layers
Углубляясь в тему
Загрузка конфигурации и поддержка расширений осуществляется с помощью unjs/c12, слияние - с помощью unjs/defu и поддержка удаленных git источников - с помощью unjs/giget. Ознакомьтесь с документацией и исходным кодом, чтобы узнать больше.