Использовать компоненты CDN со сборкой CLI? - PullRequest
0 голосов
/ 14 мая 2018

Итак, до сих пор мы создавали наши приложения Vue, используя стандартный тег script, включаемый для Vue (в основном, чтобы мы могли постепенно переходить от приложений с большим количеством jQuery / Knockout), но по мере того, как мы начинаем преобразовывать наши более сложныеприложения, я уже вижу проблемы с обслуживанием, которые у нас возникнут, если мы не сделаем переход на сборку CLI раньше, чем позже.

Теперь, это не проблема для многихнаши приложения, но так как мы вначале приняли «внутренний CDN» подход в наших приложениях Vue, объединение всего в Webpack кажется чем-то вроде шага назад в универсальности.Прямо сейчас мы обслуживаем 4 файла, а затем каждый маршрут в нашем приложении MVC имеет свой собственный связанный экземпляр Vue (то есть: about.js), который контролирует весь пользовательский интерфейс и его логику.Наш CDN обслуживает: 1. polyfills.js (для совместимости с браузером), 2. vendor.js (axios, moment.js и некоторые другие), 3. vue.js (vue + vee-validate) и 4. component.js(наша собственная библиотека компонентов пользовательского интерфейса).

В общем, меня не волнует 1-3.Все они могут быть связаны в сборке CLI веб-пакета.Это # 4, на котором я зациклен, так как обслуживание через CDN позволило нам мгновенно загружать обновления для всех наших приложений без запуска новой сборки.Сейчас у нас всего 7 приложений, работающих с полной сборкой Vue, но мы намерены в конечном итоге преобразовать все 80+ наших внутренних приложений, а также несколько существующих и новых внешних приложений в Vue.Если в 30 наших приложениях используется один из наших общих компонентов, и его необходимо обновить, чтобы учесть какие-либо проблемы с функциональностью, доступностью и т. Д., Это означает, что мы должны перестроить все 30 приложений и запустить их, что вовсе не идеально.

Есть ли способ продолжить использовать сборку CDN только для наших компонентов и объединить остальные как SPA с Webpack?

Обратите внимание: Это нетак же, как ссылки на внешнюю библиотеку JS, например, на jQuery.Я пытаюсь добавить Vue Components .Если вы загружаете подобную библиотеку извне, а затем пытаетесь импортировать компонент с помощью:

<ComponentName/>

Vue выдаст вам консольную ошибку:

[Vue warn]: Unknown custom element: <ComponentName> - did you register the component correctly? For recursive components, make sure to provide the "name" option.

found in

    ---> <App> at src\App.vue
           <Root>

Просто добавьте ее так:

export default {
    name: 'app',
    components: {
       ComponentName
    }
}

Вернет:

Uncaught ReferenceError: ComponentName is not defined

Потому что нет импорта.Но попытка импортировать его также не будет работать, потому что он не существует в приложении, он внешний.

Ответы [ 3 ]

0 голосов
/ 15 мая 2018

Вы пытались настроить несколько точек входа в своем webpack.config.js? Затем вы можете использовать одну точку входа для загрузки только ваших компонентов, а другую - для всего остального. Я полагаю, что приведенные ниже примеры строк с сайта webpack должны работать.

{
  entry: {
    app: './src/app.js', //Exports to /dist/app.js
    search: './src/components.js' //Exports to /dist/components.js
  },
  output: {
    filename: '[name].js',  //[name] is replaced with the 
                            //key names in the entry option(app & search) 
    path: __dirname + '/dist'
  }
}

Затем вы создаете файл /src/app.js, который импортирует ваши элементы 1-3 и /src/components.js, который импортирует ваши .vue файлы.

0 голосов
/ 05 июня 2018

Вы хотели бы управлять своими приложениями с помощью сборки CLI Vue Webpack, но сохраняя гибкость, имея независимые компоненты Vue, т.е. служили в качестве отдельных файлов, которые являются общими для нескольких приложений / проектов. Это архитектура, которую вы описываете с помощью « внутреннего CDN ».

Как указал @RandyCasburn, вы можете достичь вышеуказанной цели, просто выставив Vue глобально (обычно загружая его в <script> из CDN), а затем загрузив ваши независимые файлы, которые используют Vue.component для глобальной регистрации ваших компонентов.

Справка: Как «импортировать» компонент Vuejs в index.html?

Однако вы хотели бы иметь возможность разрабатывать эти независимые компоненты Vue в виде отдельных файловых компонентов (SFC).

Я вижу в основном 2 интересных решения для использования, которое вы описываете:

  1. Заполнение пробела в создании небольшого инструмента шага сборки для преобразования вашего SFC в простой файл JS, который можно загрузить через тег <script> и который регистрирует компонент глобально с помощью Vue.component.
  2. Вместо создания файла JS, который регистрируется через Vue.component, сделайте так, чтобы он предоставлял объект конфигурации Vue Component / параметров , чтобы он мог быть локально зарегистрированным и загружается асинхронно . Это требует больше работы, потому что вам нужно настроить каждую конфигурацию веб-пакета потребительского приложения для асинхронной загрузки не связанных блоков.

Вариант 1: преобразование Vue SFC в один файл JS с помощью Vue.component

На самом деле существует недавний шаблонный проект, который предлагает эту функцию:

https://github.com/RonnieSan/vue-browser-sfc

Шаблон для настройки сборки для компиляции отдельных файловых компонентов (.vue) в автономный файл JS для использования в браузере

См. Также Компилировать компонент ".vue" в браузере, только с JS?

Он использует webpack для преобразования вашего .vue файла в скомпилированный JS-файл, который регистрирует компонент глобально с Vue.component.

Вы также можете сделать очень похожий процесс, используя Rollup вместо webpack, если вам интересен более простой код. Используйте rollup-plugin-vue .

Преимущество этого подхода состоит в том, что его легко понять, вам просто нужно провести рефакторинг вашего HTML-кода для загрузки Vue, а затем файлов JS всех ваших общих компонентов. Даже во время разработки эти компоненты должны быть доступны в глобальном масштабе, поэтому среда выполнения Vue не должна жаловаться на « Неизвестный пользовательский элемент », а в вашем потребительском приложении просто не import / объявляйте их.

Недостатком является то, что вам необходимо загружать все эти компоненты заранее, независимо от того, используете вы их или нет.

Вариант 2: преобразование Vue SFC в один файл JS как объект параметров «асинхронный»

Этот гораздо интереснее, но сложнее правильно настроить.

Как и в предыдущем решении, на стороне компонента вы используете шаг сборки для преобразования файла SFC .vue, но вам не нужна дополнительная оболочка с объявлением Vue.component. Просто сделайте, чтобы webpack или Rollup обернули объект опций компонента во IIFE или UMD, который регистрирует объект в глобальном контексте.

Например, ваш rollup.config.js файл будет выглядеть так:

import VuePlugin from 'rollup-plugin-vue'

export default {
  input: 'components/my-component.vue',
  output: {
    file: 'dist/my-component.js',
    name: 'MyComponent', // <= store the component on `window.MyComponent`
    format: 'umd',
  },
  plugins: [VuePlugin()]
}

Затем в ваших пользовательских приложениях вы все еще import() и объявляете свои компоненты, но вам нужно настроить конфигурацию веб-пакета, чтобы он не связывал файлы в приложении, а асинхронно загружал их из сети. Например:

components: {
  'my-component': () => import('my-component'),
},

Для этого вы можете использовать dynamic-cdn-webpack-plugin , но вы должны предоставить собственную функцию resolver, потому что по умолчанию module-to-cdn использует собственный список модулей , который не настраивается.

Вы перечисляете свои компоненты в опции массива only динамического cdn-webpack-plugin, предоставляете resolver, который имитирует module-to-cdn, но использует ваш собственный список. Например:

const modules = {
  'my-component': {
    var: 'MyComponent', // <= name under which the component will be stored.
    versions: {
      '*': {
        development: 'http://localhost:8080/my-cdn/my-component.js',
        production : 'http://localhost:8080/my-cdn/my-component.min.js',
      },
    },
  },
};

Чтобы эта схема работала, вы также должны перечислить ваши компоненты как модули в ваших package.json зависимостях, возможно, с фиктивным локальным путем в качестве спецификации версии, чтобы убедиться, что вы не пытаетесь загрузить их из реестра npm.

Преимущество заключается в том, что вам не нужно прикасаться к вашим HTML-файлам, асинхронная загрузка напрямую управляется вашими приложениями. Вы можете связать Vue и не заботиться о порядке загрузки / последовательности. Компоненты CDN загружаются по требованию, когда это действительно необходимо.

Недостатком является то, что он требует более сложной конфигурации веб-пакетов для всех ваших пользовательских приложений, но он полностью управляем.

0 голосов
/ 14 мая 2018

Ну, технически вы можете использовать http-vue-loader , который будет загружать .vue компоненты по HTTP. Однако есть некоторые ограничения, и они не рекомендуются для производства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...