задний план
Система гоу старая, большая и грязная.Каждый раз, когда разработка спроса крайне неудобна, вряд ли допустимо начинать 30|40 секунд.Ведь это происходит только раз в день, но
HMR
Обновляется несколько секунд, терпеть не могу, я увидел рассвет, когда увидел vite2! тарелка это
Давайте посмотрим на запуск и компиляцию vue-cli3...
- Этот проект представляет собой внутреннюю систему управления операциями, возраст 6+
- на основе
vue2+elementui
, 2 года вступления будетvue-cli2
обновлен доvue-cli3
, 2 года спустя сегодня я не могу дождаться, чтобы бежатьvite2
охватывать - Мигрируйте только среду разработки (моей проблемой является только среда разработки, вы можете сами рассмотреть производственную среду)
Анализ болевых точек
по сути правильноwebpack
Анализ принципа работы,webpack
Рабочий процесс в среде разработки примерно такой (личное мнение не нравится или нет):
Найти входной файл => Анализ зависимостей => Преобразовать функцию модуля => Упаковать и сгенерировать пакет => Запуск службы узла
Так что по мере того, как проект становится больше, скорость становится все медленнее и медленнее...
Что касаетсяHMR
То же верно, ноHMR
Является ли текущий файл записью, проводимойrebuild
, связанные зависимости должны быть перегружены
ЗачемVite
- вит основан на
esm
Реализовано, основные браузеры уже поддерживают его, поэтому нет необходимости упаковывать и компилировать файл. - Проект запускается очень быстро (простые оценочные данные после миграции увеличиваются с 30с до 1с. В 30 раз? 3000%? Совсем не преувеличение...)
- или на основе
esm
,HMR
Очень быстро, не нужно компилировать и перезагружать, скорость можно описать в мгновение ока...
vite
Грубый рабочий процесс:
Запустить службу => найти файл записи (скрипт модуля) => браузер отправляет запрос => vite перехватывает обработку запроса и возвращает файл в браузер
Откройтесь и встаньте на путь миграции
-
Установите связанные пакеты npm
npm i vite vite-plugin-vue vite-plugin-html -D
-
vite-plugin-vue
, для строительстваvue
,нагрузкаjsx
-
vite-plugin-html
, для внедрения шаблона входного файла
-
-
существует
package.json
файл, добавьтеvite
Команда запуска:"vite": "cross-env VITE_NODE_ENV=dev vite"
-
новый корневой каталог
vite.config.js
документ -
Буду
public
внизindex.html
Скопируйте копию в корневой каталогМигрируйте только среду разработки, index.html по-прежнему требуется для общедоступных, а режимы vite и webpack поддерживаются в среде разработки.
-
Изменить корневой каталог
index.html
(Файл входа для запуска vite должен быть корневым каталогом)<% if (htmlWebpackPlugin.options.isVite) { %> <script type="module" src="/src/main.js"></script> <%}%>
htmlWebpackPlugin внедряется в vite.config.js, isVite используется для определения того, является ли запуск vite.
import { injectHtml } from 'vite-plugin-html'; export default defineConfig({ plugins:[ injectHtml({ injectData: { htmlWebpackPlugin: { options: { isVite: true } }, title: '运营管理平台' } }) ] })
-
все
vite.config.js
настроитьimport { defineConfig } from 'vite' import path from 'path' import fs from 'fs' import { createVuePlugin } from 'vite-plugin-vue2' import { injectHtml, minifyHtml } from 'vite-plugin-html' import dotenv from 'dotenv' try { // 根据环境变量加载环境变量文件 const VITE_NODE_ENV = process.env.VITE_NODE_ENV const envLocalSuffix = VITE_NODE_ENV === 'dev' ? '.local' : '' const file = dotenv.parse(fs.readFileSync(`./.env.${VITE_NODE_ENV}${envLocalSuffix}`), { debug: true }) for (const key in file) { process.env[key] = file[key] } } catch (e) { console.error(e) } const resolve = (dir) => { return path.join(__dirname, './', dir) } export default defineConfig({ root: './', publicDir: 'public', base: './', mode: 'development', optimizeDeps: { include: [] }, resolve: { alias: { 'vendor': resolve('src/vendor'), '@': resolve('src'), '~component': resolve('src/components') }, extensions: [ '.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue' ] }, plugins: [ createVuePlugin({ jsx: true, jsxOptions: { injectH: false } }), minifyHtml(), injectHtml({ injectData: { htmlWebpackPlugin: { options: { isVite: true } }, title: '运营管理平台' } }) ], define: { 'process.env': process.env }, server: { host: '0.0.0.0', open: true, port: 3100, proxy: {} } })
Соответствующая конфигурация будет подробно описана в проблемах, возникающих ниже.
Проблемы, возникающие при миграции
-
Uncaught SyntaxError: The requested module 'xx.js' does not provide an export named 'xx'
Я столкнулся с двумя ситуациями:
А. Модуль может иметь только один выход по умолчанию.
import
Фигурные скобки после команды ставить не нужно, иначе будет сообщено об ошибкеМетод обработки: оригинал
{}
импортированныйkeys
, изменено на импорт по умолчаниюkey
,es6
присваивание деструктуризации-import { postRedeemDistUserUpdate } from '@/http-handle/api_types' +import api_types from '@/http-handle/api_types' +const { postRedeemDistUserUpdate } = api_types
б. Браузер поддерживает только
esm
,не поддерживаетсяcjs
, необходимоcjs
изменить наesm
(Я прочитал онлайн-статью и прошелcjs2esmodule
обработано, но некоторые сценарии моего приложения ошибочны и в итоге удалены)Способ обращения: Не рекомендуется
cjs2esmodule
, установите вручнуюmodule.exports
изменить наexport
-module.exports = { +export default {
-
.vue
расширение файла, последняя версияvite
кажется, поддерживаетсяextensions
Добавить к.vue
, но рекомендуется добавлять суффикс вручную. (Операция Sao: регулярное добавление совпадающей партии) -
Uncaught ReferenceError: require is not defined
Браузер не поддерживает cjs
Метод обработки:
require
Все указанные файлы должны быть изменены наimport
Цитировать -
начало, пустая страница
Метод обработки: обратите внимание на входной файл index.html, вам нужно разместить корневую директорию проекта
-
vite
По умолчанию нетprocess.env
,доступныйdefine
определить глобальные переменныеvue-cli
В режиме переменные окружения считываются из корневого каталога.env
переменные в файле, затемvite
Можно ли читать в .env
Переменные в файле в конечном итоге внедряются вprocess.env
в?Возможно ли, чтобы эти два режима сосуществовали? Стоимость уменьшилась?
Метод обработки:
- Установите инструмент загрузки переменных среды:
dotenv
npm i dotenv -D
-
пользовательская глобальная переменная
process.env
vite.config.js
Средняя конфигурация
define: { 'process.env': {} }
-
Загрузите переменные среды и добавьте в
process.env
vite.config.js
Средняя конфигурацияПоскольку переносится только среда разработки, я читаю здесь файл .local по умолчанию.
VITE_NODE_ENV внедряется через cross-env при запуске
- Установите инструмент загрузки переменных среды:
import dotenv from 'dotenv'
try {
const VITE_NODE_ENV = process.env.VITE_NODE_ENV
const envLocalSuffix = VITE_NODE_ENV === 'dev' ? '.local' : ''
const file = dotenv.parse(fs.readFileSync(`./.env.${VITE_NODE_ENV}${envLocalSuffix}`), {
debug: true
})
console.log(file)
for (const key in file) {
process.env[key] = file[key]
}
} catch (e) {
console.error(e)
}
-
jsx
служба поддержкиvite.config.js
Средняя конфигурацияplugins: [ createVuePlugin({ jsx: true, jsxOptions: { injectH: false } })
-
в вебпаке
require.context
метод, вvite
китайский посол用import.meta.glob
заменять
Существующие проблемы
Функция импорта/экспорта в проекте реализована на чистом фронтенде
require('script-loader!file-saver')
require('script-loader!@/vendor/Blob')
Поскольку вышеуказанные файлы в настоящее время не поддерживаютсяimport
импорт,webpack
Следующее черезscript-loader
Нагрузка подключена к глобальной,vite
среда не может быть решена. Когда вам нужна функция импорта и экспорта, вы можете переключиться только наvue-cli
Режим запуска службы...
Если у тебя есть план, пожалуйста, направь меня~, я действительно не хочу возвращатьсяwebpack
развитый...
наконец
Общая миграция не вызвала каких-либо неразрешимых проблем, и стоимость миграции по-прежнему невелика.Фактическая операция составляет 1-2 дня, а эффективность затрат очень высока.Согласно данным, мой проект в десятки раз превышает эффективность запуска. и несколько раз HMR.Повышение эффективности... Вы можете попробовать это на своей внутренней системе.
Вышеупомянутое является только записью личной практики, а не ориентировочной ценностью, только для справки...