Да, в Vue.js можно использовать сборки времени выполнения (runtime-only builds) для всех шаблонов, но с важными ограничениями и особенностями.
Различие между сборками
-
Полная сборка (Full Build):
- Включает компилятор шаблонов
- Позволяет компилировать строковые шаблоны на клиенте
- Больший размер (```30% больше runtime-only)
-
Сборка времени выполнения (Runtime-only):
- Нет компилятора шаблонов
- Только предварительно скомпилированные шаблоны
- Меньший размер, лучшая производительность
Как использовать runtime-only для всех шаблонов
1. Предварительная компиляция шаблонов
Все шаблоны должны быть предварительно скомпилированы в render-функции:
// Вместо строкового шаблона
{
template: '<div>{{ message }}</div>'
}
// Используйте render-функцию
{
render() {
return h('div', this.message)
}
}
2. Настройка сборки в проекте
В vue.config.js
:
module.exports = {
runtimeCompiler: false // Отключает компилятор шаблонов
}
3. Использование однофайловых компонентов
SFC автоматически компилируются в render-функции при сборке:
<template>
<!-- Этот шаблон будет предварительно скомпилирован -->
<div>{{ message }}</div>
</template>
Ограничения runtime-only
-
Нельзя использовать:
- Строковые шаблоны через
template: '...'
- DOM-шаблоны через
el: '#app'
с inline-шаблонами
- Динамическую компиляцию шаблонов на клиенте
-
Требуется:
- Webpack/Vite с vue-loader для .vue файлов
- Предварительная компиляция всех шаблонов
Обходные пути
- Рендер-функции:
Vue.createApp({
render() {
return h('div', 'Hello World')
}
}).mount('#app')
- JSX (если настроен):
render() {
return <div>{this.message}</div>
}
- Динамические компоненты через
<component :is="">
Преимущества runtime-only
- Меньший размер бандла (на ```30%)
- Лучшая производительность (нет компиляции на клиенте)
- Более строгая CSP (без eval/new Function)
Когда нужна полная сборка
- Динамическая компиляция шаблонов из строк
- Использование
template
в корневом экземпляре
- Интеграция с серверным рендерингом без сборки
Настройка в разных инструментах
Webpack
// webpack.config.js
resolve: {
alias: {
'vue$': 'vue/dist/vue.runtime.esm-bundler.js'
}
}
Vite
// vite.config.js
export default {
resolve: {
alias: {
'vue': 'vue/dist/vue.runtime.esm-bundler.js'
}
}
}
Резюмируем:
- Runtime-only сборки можно использовать для всех шаблонов при правильной настройке
- Все шаблоны должны быть предварительно скомпилированы
- SFC (.vue файлы) - лучший подход для работы с runtime-only
- Полная сборка нужна только для специфических случаев
- Runtime-only дает преимущества в размере и безопасности
- Настройка зависит от используемого инструмента сборки