Создание глубоко вложенного HTML с помощью Vue-Cli занимает вечность - PullRequest
0 голосов
/ 08 июня 2018

Я обнаружил, что процесс сборки vue-cli (2.9.6, но 3.0.0 beta * имеет ту же проблему) занимает вечность, как только html шаблона становится относительно глубоким.

Например, я простодобавил div s к App.vue, который предварительно включен:

<template>
  <div id="app">
    <img src="./assets/logo.png">
    <div><div><div><div></div></div></div></div>
    <HelloWorld/>
  </div>
</template>

, который не занимает много времени.

Но как только он получит это:

<template>
  <div id="app">
    <img src="./assets/logo.png">
    <div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div>
    <HelloWorld/>
  </div>
</template>

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

Как мне справиться с этой проблемой?

РЕДАКТИРОВАТЬ (Подробности)

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

Эта проблема может быть воспроизведена, по крайней мере, в следующих средах:

  • macOS HighSierra на Mac mini (конец 2014 г.)
  • Ubuntu 18.04 на Dell XPS 13

, версия узла и npm:

node --version
# prints
v8.9.4
# and
npm version
# prints
{ npm: '6.1.0',
  ares: '1.10.1-DEV',
  cldr: '31.0.1',
  http_parser: '2.7.0',
  icu: '59.1',
  modules: '57',
  nghttp2: '1.25.0',
  node: '8.9.4',
  openssl: '1.0.2n',
  tz: '2017b',
  unicode: '9.0',
  uv: '1.15.0',
  v8: '6.1.534.50',
  zlib: '1.2.11' }

С этимимы повторили на моем Mac следующее:

npm uninstall -g vue-cli
npm install -g vue-cli
vue init webpack divnest
# then some Enter keys - everything is default
cd divnest

Затем откройте App.vue и добавьте много делений:

<template>
  <div id="app">
    <img src="./assets/logo.png">
    <div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div>
    <router-view/>
  </div>
</template>

(Так как я использовалЗдесь настройки по умолчанию <router-view/> включены в отличие от оригинального сообщения, но это не должно быть проблемой.)

И, наконец,

npm run dev

, что занимает вечно - в частности, процесс останавливаетсяна этом этапе:

 13% building modules 28/31 modules 3 active ...myname/Documents/divnest/src/App.vue

В случае

npm run build

процесс останавливается на этом этапе:

> divnest@1.0.0 build /Users/myname/Documents/divnest
> node build/build.js

Hash: 483ebabc54d5aed79fd7
Version: webpack 3.12.0
Time: 13742ms
                                                  Asset       Size  Chunks             Chunk Names
               static/js/vendor.7fed9fa7b7ba482410b7.js     112 kB       0  [emitted]  vendor
                  static/js/app.f1ebca7a6e0ec0b7ebdf.js      12 kB       1  [emitted]  app
             static/js/manifest.2ae2e69a05c33dfc65f8.js  857 bytes       2  [emitted]  manifest
    static/css/app.30790115300ab27614ce176899523b62.css  432 bytes       1  [emitted]  app
static/css/app.30790115300ab27614ce176899523b62.css.map  828 bytes          [emitted]  
           static/js/vendor.7fed9fa7b7ba482410b7.js.map     553 kB       0  [emitted]  vendor
              static/js/app.f1ebca7a6e0ec0b7ebdf.js.map    23.3 kB       1  [emitted]  app
         static/js/manifest.2ae2e69a05c33dfc65f8.js.map    4.97 kB       2  [emitted]  manifest
                                             index.html  509 bytes          [emitted]  

  Build complete.

  Tip: built files are meant to be served over an HTTP server.
  Opening index.html over file:// won't work.

 94% asset optimization 

и если я его отпущу,требуется ... 1155409мс !!!!

 DONE  Compiled successfully in 1155409ms                                                        13:35:34

 I  Your application is running here: http://localhost:8080

БОЛЬШЕ РЕДАКТИРОВАТЬ

Как указывал @ tony19, симпатичнее, скорее всего, подозреваемый.Следуя совету, я попробовал некоторые шаблоны с Ubuntu 18.04 (не Mac, потому что Mac сейчас нет, извините), и мои результаты:

  • vue-cli 2.9.6 + npm run dev - зависание
  • vue-cli 2.9.6 + npm run build - 6 секунд (Это так запутанно. Что было за 1 миллион секунд выше!? Может быть, переустановка vue-cli обязана изменением?)
  • vue-cli 3.0.0-beta16 + vue serve - зависание (в отличие от отчета @ tony19)
  • vue-cli 3.0.0-beta16 + vue build - 5 секунд

ДАЖЕ БОЛЬШЕ РЕДАКТИРОВАТЬ

Итак, кажется, что это определенно вызвано красивее.https://github.com/prettier/prettier/issues/1250 - это исходная проблема, которая решала эту проблему, и команда разработчиков подумала, что https://github.com/prettier/prettier/pull/2259 исправила ее, но реальность такова, что она не могла справиться с моим делом, как @ tony19 показывает это на https://github.com/prettier/prettier/issues/4672.О, хорошо.

"РЕШЕНИЕ"

Я закончил тем, что сделал это - следуя отчету @ tony19, меняя /node_modules/vue-loader/lib/template-compiler/index.js строки 78: 81

if (!isProduction) {
  code = prettier.format(code, { semi: false })
}

на

// if (!isProduction) {
//   code = prettier.format(code, { semi: false })
// }

Таким образом, проблема решена.Спасибо интерфейс, спасибо.

Ответы [ 4 ]

0 голосов
/ 18 марта 2019

Обновление 2019

Недавно vue-loader добавил флаг в свои опции, чтобы отключить prettier также во время разработки.

Просто добавьте prettify: false к своим vue-loader опциям.

https://vue -loader.vuejs.org / options.html # prettify

Примечание: просто убедитесь, что у вас установлена ​​последняя версия vue-loader

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

Я могу воспроизвести проблему с производительностью, как вы описали (macOS High Sierra 10.13.4, Node 8.9.4 и 9.11.1).Эта проблема также возникает в недавно созданном проекте vue-cli 3.x.

В действительности зависание происходит в prettier, вызываемом из vue-loader шаблонного компилятора .Вложенные <div> s преобразуются в JavaScript с помощью vue-loader, и это становится следующим фрагментом:

var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{"id":"app"}},[_c('img',{attrs:{"src":require("./assets/logo.png")}}),_vm._v(" "),_c('router-view'),_vm._v(" "),_vm._m(0)],1)}
var staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('div',[_c('div',[_c('div',[_c('div',[_c('div',[_c('div',[_c('div',[_c('div',[_c('div',[_c('div',[_c('div',[_c('div',[_c('div',[_c('div',[_c('div',[_c('div',[_c('div',[_c('div',[_c('div',[_c('div',[_c('div',[_c('div',[_c('div',[_c('div')])])])])])])])])])])])])])])])])])])])])])])])])}]

vue-loader передает эту длинную строку в prettier, для обработки которой требуется около 159 секунд,Причиной ошибки являются глубоко вложенные вызовы функций, которые создают div s.Я сообщил об этой ошибке в prettier ( Issue 4672 ).

Тем временем я рекомендую рефакторинг вашего HTML, чтобы избежать глубокого вложения.Если вам нужно придерживаться старого шаблона, вы можете обойти проблему, собрав в производственном режиме: vue-loader пропуск prettier для производственных сборок:

NODE_ENV=production npm run dev

ОБНОВЛЕНИЕ vue-loader v15.5.0 добавляет опцию prettify, чтобы разрешить отключение prettier (обновите до последней версии @vue/cli, чтобы убедиться, что ваш vue-loader актуален с новой опцией).Вы можете использовать эту опцию следующим образом:

  1. Добавьте vue.config.js (если он еще не существует) в корень вашего проекта.

  2. Отредактируйте файл, включив в него:

    module.exports = {
      chainWebpack: config => {
        config.module
          .rule('vue')
          .use('vue-loader')
            .loader('vue-loader')
            .tap(options => {
              options.prettify = false
              return options
            })
      }
    }
    
0 голосов
/ 17 ноября 2018

У меня были похожие проблемы с vue-cli 3.1.1 (TypeScript + SCSS) и Bootstrap (который по умолчанию требует некоторой вложенности).Пример структуры:

<template>
    <div class="container">
        <div class="row">
            <div class="col-12">
                <div class="card-deck">
                    <div class="card">
                        <div class="card-body">
                            <div class="accordion">
                                <div class="card">
                                    <div class="card-header">
                                        ...
                                    </div>
                                    <div class="collapse">
                                        <div class="card-body">
                                            <div class="row">
                                                <div class="col-12 form-group">
                                                    <label>...</label>
                                                    <div class="dropdown">
                                                        <button class="custom-select" type="button" data-toggle="dropdown">{{someValue}}</button>
                                                        <div class="dropdown-menu">
                                                            <a class="dropdown-item" href="#" :data-key="somekey1" @click="onClickMethod">value1</a>
                                                            <a class="dropdown-item" href="#" :data-key="somekey2" @click="onClickMethod">value2</a>
                                                            ...

требуется ~ 12 секунд для компиляции 400+ строк кода (шаблон + TypeScript + SCSS).После удаления:

:data-key="somekey1" @click="onClickMethod"
:data-key="somekey2" @click="onClickMethod"

коду понадобилось ~ 5-6 секунд для компиляции.После перемещения кода в пользовательский компонент (и некоторый код TypeScript из компонента Vue в файл Helper.ts):

<template>
    <div class="container">
        <div class="row">
            <div class="col-12">
                <div class="card-deck">
                    <div class="card">
                        <div class="card-body">
                            <div class="accordion">
                                <div class="card">
                                    <div class="card-header">
                                        ...
                                    </div>
                                    <div class="collapse">
                                        <div class="card-body">
                                            <SubComponent/>

для компиляции требуется ~ 700 мс (один основной компонент и два дополнительных подкомпонента, каждый файлс менее чем 100 строками кода + Helper.ts с ровно 97 строками кода).

Итак, если вы страдаете от низкой производительности npm run serve, попробуйте сначала субкомпоненты, я не заметил большой разницы ввремя компиляции при вызове npm run build, поэтому я предполагаю (возможно, неправильно), что эта проблема также вызвана префиксатором кода, который включен для serve, но отключен для build (TSLint не вызывается при сохранении, поэтому он не влияет на npm run serve в моем случае).

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

У меня нет особых проблем с вашими 25 вложенными <div>: (пример ниже с компилятором времени выполнения Vue, так что вы можете легко протестировать его прямо в вашем браузере)

new Vue({
  el: '#app',
  template: '#app-template',
});
#app div {
  border: 1px solid grey;
  padding: 1px;
}
<script src="https://unpkg.com/vue@2"></script>

<div id="app">
</div>

<template id="app-template">
<div id="app">
  <div>
    <div>
      <div>
        <div>
          <div>
            <div>
              <div>
                <div>
                  <div>
                    <div>
                      <div>
                        <div>
                          <div>
                            <div>
                              <div>
                                <div>
                                  <div>
                                    <div>
                                      <div>
                                        <div>
                                          <div>
                                            <div>
                                              <div>
                                                <div>
                                                  <div>25 nested <code>&lt;div&gt;</code>'s</div>
                                                </div>
                                              </div>
                                            </div>
                                          </div>
                                        </div>
                                      </div>
                                    </div>
                                  </div>
                                </div>
                              </div>
                            </div>
                          </div>
                        </div>
                      </div>
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
  </div>
</template>

Вот демонстрация с проектом Vue CLI на CodeSandbox, возможно, ближе к вашему примеру: https://codesandbox.io/s/v3knpl447l

(т.е.он предварительно компилирует шаблоны, поэтому процесс сборки на самом деле происходит на сервере CodeSandbox)

...