Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Переехать с webpack на vite #1152

Open
viktorkasap opened this issue Sep 18, 2022 · 2 comments
Open

Переехать с webpack на vite #1152

viktorkasap opened this issue Sep 18, 2022 · 2 comments

Comments

@viktorkasap
Copy link
Collaborator

viktorkasap commented Sep 18, 2022

Задача со звездочкой ⭐

ссылки которые могут помочь разобраться
1 - https://elixirforum.com/t/a-proof-of-concept-integration-of-vite-js-modern-js-assets-bundler-with-phoenix-liveview/37171/2
2 - https://mindreframer.com/posts/js-bundling-with-instant-live-reload-for-phoenix-and-liveview/

Работа ведется в ветке - CB_1152

Скрипт билда запускать в баше аппа

  • команда чтобы войти в баш - make compose-bash
  • команда билда - npm run vite-build

для тестов сборка будет происходить в services/app/priv2, потом ее удалим и будем в priv все билдить

viktorkasap added a commit that referenced this issue Sep 18, 2022
@viktorkasap
Copy link
Collaborator Author

WIP #1152

добавил vite.config.js
добавил скрипты билда и запуска, надо будет скрипт watch добавить

@Guryanov-Maksim
Copy link
Collaborator

Guryanov-Maksim commented Dec 24, 2022

Добавил watch.

Запускается командой make compose.

На данный момент есть такие проблемы:

  1. Не работает библиотека gon (https://github.com/manvalls/gon), везде теперь используется window.Gon.
  2. UPDATE 2023.01.12
    Monaco Editor выдает вот такую ошибку в консоль браузера:
    Screenshot from 2022-12-24 16-40-24

Ошибку убрал. Причина ошибки скорее всего была в том, что в фронтенде worker порождал другой worker, но этот порожденный worker находился в домене, отличном от домена родительской страницы, что запрещено документацией. На данный момент устранил с помощью плагина vite-plugin-monaco-editor (использовал для того, чтобы собрать код для создания worker вместе с зависимоcтями в один файл и разместить в домене родительской страницы) и добавил скрипт в разметку (чтобы с помощью метода importScripts импортировать вышеуказаный bundle и запустить его для создания worker):

<script>
  self.MonacoEnvironment = ((paths) => ({
    getWorkerUrl(moduleId, label) {
      // ------- dev mode -------
      const workerBundlePath = paths[label];
      const origin = 'http://localhost:8080';
      // -------------------------

      // ------- prod mode -------
      // const workerBundlePath = `/assets/assets${paths[label]}`;
      // const origin = window.location.origin;
      // -------------------------

      const js = `importScripts("${origin}${workerBundlePath}");`;
      const blob = new Blob([js], { type: 'application/javascript' });
      return URL.createObjectURL(blob);
    }
  }))({
    editorWorkerService: "/monacoeditorwork/editor.worker.bundle.js",
    typescript: "/monacoeditorwork/ts.worker.bundle.js",
    javascript: "/monacoeditorwork/ts.worker.bundle.js",
  });
</script>

Насколько это правильно - вопрос открытый! К тому же при изменении в vite.config.js опции base этот скрипт приходится редактировать, добавляя base к пути к бандлу воркера (например, base: /assets/ ====> editorWorkerService: "/assets/monacoeditorwork/editor.worker.bundle.js",)

  1. Мидлвары с сокетами не работают без костылей при использовании hmr, пытаются подключиться дважды. Сейчас добавил везде вот такое, чтобы обойти двойное подключение:
 if (channel.state !== 'joined') {
    channel.join().receive('ok', camelizeKeysAndDispatch(actions.updateChatData));
  }
  1. Не уверен, что это правильный способ импортировать модуль:
    `../../../../node_modules/monaco-ace-tokenizer/lib/ace/definitions/${syntax}.js`

    Если использовать абсолютный путь, то возникает ошибка:
codebattle-app-1  | 1:50:38 PM [vite] warning: 
codebattle-app-1  | /app/assets/js/widgets/containers/Editor.jsx
codebattle-app-1  | 139|        const {
codebattle-app-1  | 140|          default: HighlightRules
codebattle-app-1  | 141|        } = await import(`monaco-ace-tokenizer/lib/ace/definitions/${syntax}.js`);
codebattle-app-1  |    |                         ^
codebattle-app-1  | 142|        this.notIncludedSyntaxHightlight.delete(syntax);
codebattle-app-1  | 143|        this.monaco.languages.register({
codebattle-app-1  | The above dynamic import cannot be analyzed by Vite.
codebattle-app-1  | See https://github.com/rollup/plugins/tree/master/packages/dynamic-import-vars#limitations for supported dynamic import formats. If this is intended to be left as-is, you can use the /* @vite-ignore */ comment inside the import() call to suppress this warning.

UPDATE 2023.01.12
Динамичекий импорт ( ../../../../node_modules/monaco-ace-tokenizer/lib/ace/definitions/${syntax}.js ) не подходит (скорее всего из-за того, что код библиотеки monaco-ace-tokenizer написан по стандарту ES5). Пока пришлось отказаться от динамического импорта и использовать статический импорт.

  1. Подумать, как осуществить интеграцию с бекендом

  2. Не работает сборка для продакшена. Вроде сборка заработала.

  3. Неправильно работает hmr для assets/js/widgets/App.jsx. Чтобы обойти, сделано так, что при изменении App.js страница обновляется полностью.

  4. UPDATE 2023.01.18
    Когда в vite.config.js добавляется опция base, то перестает работать hmr. Проблема не решена. Для ее обхода в режиме watch опция base не задействована, при сборке и в режиме preview используется.
    Опция base нужна в режиме preview, чтобы vite правильно построил пути для статики.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
Status: 🏗 In progress
Development

No branches or pull requests

3 participants