【发布时间】:2019-06-20 02:08:27
【问题描述】:
我正在为使用 Vue 2 和 Webpack 3 构建的 Web 应用程序使用 代码拆分 技术。JS 块以异步方式运行良好,在 Lighthouse 性能审计中给了我一个很好的分数.
但是,通过打开 DevTools 上的“Coverage”选项卡,我可以看到我的大约 99% 的 CSS 样式在第一次内容绘制时没有使用(即第一个页面加载)。原因很简单:我的main.scss 文件(如下所示)导入了项目的所有样式表,创建了一大块渲染阻塞代码。我为 Sass 文件遵循了一个通用的、流行的设计模式,但显然它不适合 Vue 使用的基于组件的模式。
我尝试从“.vue”单文件组件加载组件样式表,但我遇到了另一个问题:因为 Webpack 在我导入我的 main.scss 的主要 App.vue 文件之前解析这些文件,整个代码中使用的所有 Sass 变量都“未声明”,因此到处抛出错误。
我的main.scss 文件看起来有点像这样:
//base style
@import 'base/variables';
@import 'base/fonts';
@import 'base/tools';
@import 'base/typography';
@import 'base/general';
@import 'base/buttons';
@import 'base/elements';
// ...
//components style
@import 'components/topnav';
@import 'components/header';
@import 'components/sidemenu';
@import 'components/footer';
@import 'components/login';
// ...
//responsiveness
@import 'base/responsiveness';
// cross browser styles
@import 'base/cross-browser';
有没有办法拆分这个大文件并相应地异步加载样式,仅在需要时才加载样式,就像其他 JS 块一样?
我不相信有一些特殊的 Webpack 加载器/插件可以为我做到这一点,我正在寻找一种重构最少的解决方案。整个磨难将我的交互时间指标增加到大约 6-7 秒。
【问题讨论】:
-
也许不要使用全局
scss变量并将您的样式放在.vue文件中....任何您包装在单个文件组件中的内容都可以轻松进行代码拆分,因为 Webpack 可以创建拆分当它导入一个模块时,Vue 很乐意异步加载一个组件
标签: webpack sass vuejs2 code-splitting