Надзвичайно довгі часи компіляції за допомогою Vuetify 2.1 та Webpack


9

Я використовую Vue CLI 3 та Vuetify 2.1 в новому проекті, і нещодавно поглибився в переважаючі змінні SASS Vuetify . Після того, як нарешті я почав працювати, я зрозумів, що кожного разу, коли я змінюю variables.scssстворений мною файл і проект перекомпілюється, для збирання потрібно близько 5 хвилин. Я намагався оновити скрипт package.json, щоб збільшити пам'ять, яку використовує Node, і, хоча ця помилка виправила мене, що спричинило збій компіляції, результат тепер надзвичайно повільний час компіляції. Показовий прогрес (я використовую Foreman для одночасного запуску мого API Rails і сервера Vue) виглядає приблизно так:

17:47:29 web.1  | <s> [webpack.Progress] 69% building 916/930 modules 14 active /<path/to/app>/frontend/node_modules/css-loader/index.js??ref--9-oneOf-3-1!/<path/to/app>/frontend/node_modules/postcss-loader/src/index.js??ref--9-oneOf-3-2!/<path/to/app>/frontend/node_modules/sass-loader/lib/loader.js??ref--9-oneOf-3-3!/<path/to/app>/frontend/node_modules/vuetify/src/components/VSwitch/VSwitch.sass

Ці прогресивні навантаження, як я вже згадував, протягом п'яти хвилин, перш ніж воно остаточно закінчиться. Думаю, що оскільки я оновив змінну, їй доведеться пройти і оновити цей стиль для кожного компонента та екземпляра цієї змінної у модулі Vuetify node_module.

Моє запитання, чи є спосіб прискорити це? Можливо, я встановив щось не так, що спричинило це питання? Або це абсолютно нормально, і мені доведеться просто з цим боротися?

main.js

import Vue from 'vue';

import App from './App.vue';
import { router } from './router';
import store from './_store';
import vuetify from './plugins/vuetify';

Vue.config.productionTip = false;

new Vue({
  router,
  store,
  vuetify,
  render: h => h(App),
}).$mount('#app');

vuetify.js

import 'material-design-icons-iconfont/dist/material-design-icons.css';
import Vue from 'vue';
import Vuetify from 'vuetify/lib';

Vue.use(Vuetify);

export default new Vuetify({
  theme: {
    options: {
      customProperties: true,
    },
    themes: {
      light: {
        primary: '#4A90E2',
        darkPrimary: '#3B73B4',
        secondary: '#424242',
        accent: '#82B1FF',
        error: '#a70000',
        info: '#2196F3',
        success: '#4CAF50',
        warning: '#FFC107',
        teal: '#64EBC6',
        green: '#7ED321',
        darkGreen: '#4c8f1d',
        lightGrey: 'rgba(0,0,0,0.12)',
        darkGrey: '#4A4A4A',
        textSecondary: 'rgba(0,0,0,0.4)',
      },
    },
  },
  icons: {
    iconfont: 'md',
  },
});

змінні.scss

// Globals
$border-radius-root: 2px;
// $font-size-root: 14px;
$body-font-family: 'Avenir Next', 'Lato', Roboto, 'Helvetica Neue', Helvetica, Arial, sans-serif; // $main-font comes from my own ./_variables.scss.
$heading-font-family: 'Avenir Next', 'Lato', Roboto, 'Helvetica Neue', Helvetica, Arial, sans-serif; // $title-font comes from my own ./_variables.scss.

$headings: (
  'h1': (
    'size': 3.3125rem,
    'line-height': 1.15em
  ),
  'h2': (
    'size': 2.25rem,
    'line-height': 1.5em,
  ),
  'h3': (
    'size': 1.5625rem,
    'line-height': 1.4em
  ),
  'h4': (
    'size': 1.125rem,
    'line-height': 1.4em
  ),
  'h5': (
    'size': 1.0625rem
  ),
  'h6': (
    'size': .75rem
  ),
  'subtitle-2': (
    'size': 1rem
  ),
  'overline': (
    'letter-spacing': 0
  )
);

@import '~vuetify/src/styles/settings/variables';

// V-Btn
$btn-letter-spacing: 1px;
@import '~vuetify/src/components/VBtn/_variables';

@import '~vuetify/src/styles/main.sass';

package.json

{
  "name": "myProject",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "serve" : "node --max_old_space_size=4096 node_modules/.bin/vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint"
  },
  "dependencies": {
    "axios": "^0.19.0",
    "core-js": "^2.6.5",
    "dayjs": "^1.8.16",
    "echarts": "^4.3.0",
    "fibers": "^4.0.1",
    "material-design-icons-iconfont": "^5.0.1",
    "sass": "^1.23.0",
    "sass-loader": "7.1.0",
    "vee-validate": "^3.0.11",
    "vue": "^2.6.10",
    "vue-router": "^3.0.3",
    "vuedraggable": "^2.23.2",
    "vuetify": "^2.1.0",
    "vuex": "^3.0.1"
  },
  "devDependencies": {
    "@vue/cli-plugin-babel": "^3.12.0",
    "@vue/cli-plugin-eslint": "^3.12.0",
    "@vue/cli-service": "^3.12.0",
    "@vue/eslint-config-airbnb": "^4.0.0",
    "babel-eslint": "^10.0.1",
    "eslint": "^5.16.0",
    "eslint-plugin-vue": "^5.0.0",
    "vue-cli-plugin-vuetify": "^1.0.1",
    "vue-template-compiler": "^2.6.10",
    "vuetify-loader": "^1.2.2"
  }
}

У мене виникають подібні проблеми з часом нарощування при встановленні таких змінних Sass. Тут я також виявив, що хтось інший переживає повільний час збирання тут github.com/vuetifyjs/vuetify/isissue/9323#issuecomment-540984585 . Я б не сказав, що це взагалі "нормально", і зараз я намагаюся створити обмежене використання, щоб підняти проблему щодо vuetify github
mattGreenfield

Фантастично, дякую за відгук! Я піду разом із цим питанням і побачу, що з цього виходить. Знову дякую!
Дж. Джексон

1
Маючи точно таке питання. Видалення файлу змінних sass змушує все працювати швидко.
Заптрій

1
Я підняв нове питання, коли я все пробував, і це все ще повільно github.com/vuetifyjs/vuetify-loader/issues/95
mattGreenfield

1
У нас була така ж проблема. Час нарощування як розвитку, так і виробництва було величезним. Також vuetify-loaderє ряд помилок, тому ми вирішили використовувати повну установку vuetify без змінних SASS і vuetify-loader. Зміни значні - наш час збирання скоротився з 6 хв до <2хв, а сервер розробки запускається за 15 секунд із досить швидким гарячим перезавантаженням. У будь-якому випадку, видаливши, sass/variables.scssми знову зробили наш збірник.
Андрій

Відповіді:


2

@import '~vuetify/src/styles/main.sass';

Це вводить досить велику кількість CSS у верхню частину кожного файлу sass, тому він повторюється пару сотень разів. Файл змінних не повинен містити жодного коду, який видає фактичні стилі - дозволені лише змінні, змішання та функції.

30+ с при зміні файлу змінних є нормальним, однак, як ви здогадалися, він повинен перекомпілювати все в цьому випадку. Імпорт із них vuetify/lib/frameworkзамість цього vuetify/libможе дещо прискорити, лише включивши в комплект розроблених компонентів використовувані компоненти.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.