Автор оригинала: Anthony Gore.
Динамический импорт модуля является одним из последних функций JavaScript для удаления основных браузеров. Основной корпус для этой функции является модули для погрузки ленивых, чтобы обеспечить доставку содержимого при необходимости, а не все сразу.
В этой статье я продемонстрирую, как вы можете построить ленивый маршрутизатор с Vue.js всего за несколько строк кода. Это будет работать в родом в браузерах, которые реализовали динамический импорт модуля, но я также буду включать в себя отступление для более старых браузеров.
Возьмите законченный код здесь на Github Отказ
Примечание: эта статья была первоначально опубликована здесь на блоге разработчиков Vue.js на 2017/10/30.
Статический модуль JavaScript Module
Если вы используете последнюю версию любого крупного браузера, вы можете выполнить Статический Импорт/экспортировать сейчас. Для Vue.js это означает, что вы можете экспортировать определение компонента из такого файла:
Bookspage.js.
export default { name: 'BooksPage', template: ``, data() { return { message: 'Oh hai from the books page' } } };Books Page
{{ message }}
И импортируйте его в ваше приложение, как это:
app.js.
import BooksPage from './BooksPage'; new Vue({ components: { BooksPage } });
Создание компонентов JavaScript Modules позволяет организовать ваше приложение, чтобы каждая «страница» находится в другом файле. Это ничего нового, если вы используете компоненты Vue.js одно файловые компоненты, но с нативной поддержкой сейчас эта архитектура может быть достигнута без учета WebPack или Babel.
Я охвачу импортируя компоненты vue.js как модули JavaScript более тщательно в недавней статье Vue.js Одно файл JavaScript Компоненты в браузере Отказ
Динамический импорт модуля JavaScript
Если ваши компоненты представляют страницы, было бы лучше получить файлы модулей по требованию, чтобы пользователь не должен загружать страницы, которые они не посещают. Статический импорт разрешен в Время компиляции , тем не мение. Это означает, что вы не можете поставить Импортировать BookSpage от './Bookspage';
внутри Если
Заявление для условно нагрузки. Вместо этого ваш статический импорт начнет загрузку, как только скрипт, который загружает их.
Вот где Динамический импорт войти. Это можно определить на время выполнения , что означает, что вы можете условно загружать модуль JavaScript и, следовательно, страницы, по требованию. Обратите внимание, что динамический импорт возвращает обещание, которое разрешает содержание модуля.
import HomePage from './pages/HomePage.js'; Vue.component('my-router', { template: '', data() { return { page: HomePage } }, methods: { navigate(name) { this.page = return () => import(`./${name}Page.js`) } } });
Примечание: Компонент
это встроенный «мета» компонент, который принимает определение компонента через SPOP это
Отказ Как и все VUE компоненты, это может быть либо определение компонента, либо обещание, которое разрешает определение компонента.
Этот код будет работать в браузере, если вы используете последние сафари или Chrome Canary, с другими браузерами в ближайшее время последуют.
Создание крошечного маршрутизатора ленивого нагрузки
С этой теорией в виду давайте сделаем наш ленивый маршрутизатор. В вашем приложении создайте некоторые якорные теги, где href
это путь к компонентному модулю для этой страницы. Прослушайте событие Click на этих элементах, предотвратите перенаправление и вместо этого вызвать метод навигация
Отказ
index.html.
Мы определим навигация
Способ в экземпляре Vue, и он примет событие Click в качестве аргумента. Используйте значение ссылки href
, то есть Event.Target.Pathname , чтобы динамически импортировать необходимый модуль компонента страницы и назначить его локальному
страница Государственная собственность. Это динамически связано с
Компонент составная часть.
app.js.
import BooksPage from './pages/BooksPage.js'; new Vue({ el: '#app', data: { page: BooksPage }, methods: { navigate(event) { this.page = () => import(`./${event.target.pathname}`) // Vue.js < 2.5.0 // .then(m => m.default) ; } } });
Обратите внимание, что версии Vue.js до 2.5.0 необходимо включить Тогда
Обратный вызов, чтобы правильно разрешить определить модуль.
Это оно! Если вы запустите это в браузере, который поддерживает динамический импорт, вы увидите это:
Отступать
Как насчет пользователей, у которых нет последней версии Safari или Chrome? Им понадобится ответный удар. Давайте создадим один с WebPack.
Во-первых, нам придется изменить навигация
Метод немного. Реализация WebPack of Импорт ()
Требуется, чтобы он был раньше времени, какие файлы могут потребоваться динамически загрузка. Вам не нужно указывать точное имя модуля, просто убедитесь, что значение, которое вы предоставляете Импорт ()
является разрешенным файлом или каталогом.
Для этого мы изменим динамическое имя файла, чтобы он указывает Страницы
Справочник и извлекивает имя файла из href
И.Е. ` ./Стаки/$ {event.target.pathname.split ('/'). POP ()}
` При компиляционном времени WebPack достаточно умно, чтобы узнать это означает «какой-то файл в страницах Pages » и обработает любой файл JavaScript в этом каталоге.
Во-вторых, нам нужно поставить комментарий /* WebPackChunkName: «Страницы/[Запрос]» */
В функции, так что WebPack знает, чтобы извлечь этот кусок в отдельный файл. В противном случае WebPack будет объединять все модули компонентов страницы в одном файле, а преимущества ленивой загрузки будут изменены.
app.js.
navigate(event) { this.page = () => import( /* webpackChunkName: "pages/[request]" */ `./pages/${event.target.pathname.split('/').pop()}` ) }
WebPack Config.
Вы можете использовать этот простой конфигурацию WebPack, который имеет две заметные функции:
- Определяет
ChunkFilename
Выходное свойство. Это гарантирует, что модули компонентов страницы правильно названы на выходе WebPack. - Транкирует JavaScript с Babel. Вам понадобится плагин
Синтаксис-динамический импорт
Для Babel распознает динамичное заявление о импорте.
var path = require('path'); var webpack = require('webpack'); module.exports = { entry: './app.js', output: { path: path.resolve(__dirname, './dist'), publicPath: '/dist/', filename: 'build.js', chunkFilename: '[name].js' }, module: { rules: [ { test: /\.js$/, loader: 'babel-loader', exclude: /node_modules/, options: { plugins: [require('babel-plugin-syntax-dynamic-import')] } } ] } };
Запустите WebPack с этим конфигурацией, и вы получите файлы сборки, включая:
- Все файлы модуля JavaScript транспортированы в модули Commonjs.
- Основной пакет будет включать в себя реализацию динамического импорта WebPack.
Проверка динамической импортной поддержки
Как вы говорите браузеру использовать отступление? Насколько я знаю, нет конкретного способа проверить поддержку браузера для Импорт ()
Отказ Моя стратегия – использовать встроенный скрипт в теле документа, который создает новый Сценарий
тег и условно изменит источник (либо основной скрипт или защитник) в зависимости от поддержки для Импорт ()
Отказ
Обратите внимание, что защитный скрипт обрабатывается как обычный скрипт JavaScript, где в качестве основного сценария обрабатывается как модуль.
Заключение
Он отлично, если мы сможем использовать собственные реализации импорта JavaScript Module, поскольку оптимизации, такие как Lazy-loading, можно сделать с меньшим размером файла и намного проще. Например, реализация WebPack Импорт ()
Требуется, чтобы он знал заранее, какие файлы могут потребоваться динамически нагрузка, нативная реализация не делает.
На практике такие особенности, как это нужно будет понадобиться прогрессирующим усовершенствованиями и, следовательно, требуют, чтобы УБПАКС в качестве запятнанного, который вновь повторно выполняет те же осложнения. Ну, хорошо, это веб-разработчик для вас.
Стать старшим Vue Developer в 2020 году.
Учитесь и осваивайте, какие профессионалы знают о строительстве, тестировании и развертывании, полностью стековых Vue Apps в нашем последнем курсе.
Учить больше