#javascript #vue.js #vuetify.js
#javascript #vue.js #vuetify.js
Вопрос:
Я настраиваю новый проект Vue с базовыми строительными лесами, используя Vue CLI и Vuetify с встряхиванием дерева, чтобы исключить любые компоненты, которые мне не нужны. На самом деле меня интересуют только файлы поставщиков, в которых есть компоненты Vuetify (предположительно, chunk-vender… файлы в dist / js и dist / css).
HTML в моем проекте включает эти файлы поставщика, но я не понимаю, как зарегистрировать плагин с помощью Vue. Например, в файле JS моего приложения:
Vue.use(vuetify); // where do I get the vuetify plugin object from?
new Vue({...})
Просто для ясности, меня не интересуют файлы app
JS / CSS, созданные сборкой npm. Я использую всю эту настройку только для того, чтобы вручную выбирать нужные компоненты Vuetify и создавать необходимые JS / CSS.
Если я включу полноразмерный скрипт Vuetify / css в свой HTML из CDN, например
<script src="https://cdnjs.cloudflare.com/ajax/libs/vuetify/2.3.17/vuetify.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/vuetify/2.3.17/vuetify.min.css" rel="stylesheet" type="text/css"/>
… затем я могу инициализировать Vuetify в своих приложениях JS, например:
new Vue({
el: '#my-app',
vuetify: new Vuetify(),
})
… итак, я надеюсь выяснить, есть ли способ инициализировать Vuetify, используя JS-файл поставщика, созданный из сборки Vue CLI, вместо полной версии CDN. Если я попытаюсь использовать тот же метод инициализации, описанный выше, при использовании JS-файла сборки поставщика, я получаю сообщение об ошибке Vuetify is not defined
.
Комментарии:
1. если вы добавили vuetify с помощью vue cli, то разве все это не сделано за вас? vuetifyjs.com/en/features/treeshaking/#vuetify-loader
2. У меня есть существующий проект, который не был создан с использованием cli. Я хочу интегрировать некоторые компоненты Vuetify в свой проект. Единственный известный мне способ получить выбор нужных компонентов — это настроить сборку с помощью cli. У меня есть выходные файлы поставщика из сборки, но я не знаю, как их использовать. Предположительно, фиктивный файл приложения, созданный как часть сборки, каким-то образом регистрирует плагин Vuetify, но он уменьшен / искажен, поэтому я не могу в этом разобраться.
3. Почему вы не можете просто настроить Vuetify tree-shaking в вашем другом проекте, отличном от Vue-CLI?
4. @tony19 На самом деле я не использую никаких инструментов сборки для своего проекта или менеджера пакетов. Я просто добавляю номер версии к файлам поставщика Vuetify, созданным сборкой. Хотя, в качестве альтернативного решения, может быть, вы могли бы привести пример того, как это настроить, или указать мне правильное направление?
Ответ №1:
На самом деле существует более идиоматичный способ создания библиотеки с помощью Vue CLI. В вашем build
NPM-скрипте должен быть указан тип сборки библиотеки и точка входа, которая экспортирует плагин Vue (например, src/plugins/vuetify.js
), где установлены только определенные компоненты Vuetify.
Например, для создания плагина Vue, который устанавливает только VApp
(требуется как корневой компонент в Vuetify 2.x), VContainer
VBtn
, и VTextField
компоненты:
-
Выполните эти команды, чтобы сгенерировать проект Vue CLI с параметрами по умолчанию:
npx @vue/cli create --default my-vuetify cd my-vuetify
-
Запустите эту команду из корневого каталога проекта, чтобы добавить Vuetify в проект (и выберите предустановку по умолчанию в командной строке):
npx @vue/cli add vuetify
-
Отредактируйте
build
NPM-скрипт проектаpackage.json
, чтобы создать библиотеку с именемMyVuetify
(это будет глобальная переменная, установленная при импорте библиотеки в ваш<script>
тег):// package.json { "scripts": { // BEFORE: "build": "vue-cli-service build", // AFTER: "build": "vue-cli-service build --target lib --name MyVuetify src/plugins/vuetify.js", } }
-
В файле ввода плагина экспортируйте
vuetify
функцию, которая создает новыйVuetify
экземпляр:// src/plugins/vuetify.js import Vuetify from 'vuetify/lib' export const vuetify = options => new Vuetify({ ...options })
Также экспортируйте
plugin
объект, содержащийinstall
функцию, которая определяет только интересующие компоненты Vuetify:// src/plugins/vuetify.js import { VApp, VContainer, VBtn, VTextField } from 'vuetify/lib' export const plugin = { install(app, options) { app.use(Vuetify, { components: { // Vuetify 2.x requires `VApp` to be the root component, so `VApp` // needs to be exported unless you prefer the consumer app provided it VApp, VContainer, VBtn, VTextField, }, ...options }) } }
-
Запустите эту команду для сборки библиотеки:
npm run build
Использование
dist/demo.html
Из выходных данных сборки библиотеки загрузите скрипт UMD ( MyVuetify.umd.js
), который задает глобальное имя MyVuetify
, содержащее экспорт из выходных данных сборки (определенный ранее на шаге 4). Также загрузите styles ( MyVuetify.css
), который содержит CSS для используемых компонентов Vuetify.
<script src="./MyVuetify.umd.js"></script>
<link rel="stylesheet" href="./MyVuetify.css">
Наконец, создайте <script>
блок, который устанавливает плагин MyVuetify.plugin
и инициализирует приложение Vue vuetify
с помощью MyVuetify.vuetify()
:
<script>
Vue.use(MyVuetify.plugin)
new Vue({
vuetify: MyVuetify.vuetify(/* Vuetify options (e.g., `theme`) */),
})
</script>
Вот полный dist/demo.html
:
<script src="https://unpkg.com/vue@2.6.12/dist/vue.min.js"></script>
<script src="./MyVuetify.umd.js"></script>
<link rel="stylesheet" href="./MyVuetify.css">
<v-app id="app">
<v-container>
<form @submit.prevent="greet">
<v-text-field v-model="name" label="Name"></v-text-field>
<v-btn type="submit">Greet</v-btn>
</form>
</v-container>
</v-app>
<script>
Vue.use(MyVuetify.plugin)
new Vue({
el: '#app',
vuetify: MyVuetify.vuetify(),
data: () => ({
name: '',
}),
methods: {
greet() {
alert(`Hi ${this.name.trim() || 'there'}!`)
}
}
})
</script>
Комментарии:
1. Это действительно здорово, спасибо за подробный пример. Я не понимал, что мне нужно было сообщить сборке, что я создаю библиотеку.