【问题标题】:Can webpack bundle css/scss/less without duplicating required files?webpack 可以在不复制所需文件的情况下捆绑 css/scss/less 吗?
【发布时间】:2016-06-19 15:23:04
【问题描述】:

假设我有以下 2 个组件,直接需要相同的实用程序 css 文件。

组件一:

import component1Css from '/path/to/component1.scss'
import someOtherUtilityCss from './path/to/some-other-css.scss'
...
export default Component1;

组件二:

import component2Css from './path/to/component2.scss'
import someOtherUtilityCss from './path/to/some-other-css.scss'
...
export default Component2;

然后我将它们包含在我的应用中:

主应用:

import someLayoutCss from './path/to/some-layout.css';
import Component1 from './path/to/component1'
import Component2 from './path/to/component2'

...

export default App;

我希望捆绑系统知道只导入一次some-other-css.scss

style-loader + css-loader 是否已经开箱即用?

此外,

如何处理内部 css 导入?

如果我通过 import 语句在 javascript 中导入了 cssFile1 和 cssFile2:

import cssFile1 from 'path/to/file1.scss'
import cssFile2 from 'path/to/file2.scss'

而且cssFile1和cssFile2都在内部导入cssFile3,那么在file1.css和file2.css中cssFile3的内容会出现重复吗?或者 sass-loader 会解决这个问题并只包含一次 cssFile3 吗?

【问题讨论】:

    标签: css webpack webpack-style-loader


    【解决方案1】:

    我认为 sass-loader 会删除重复项。
    如果 css 不在项目中,它将重复。
    你可以使用 webpack config resolveLoader 来删除重复项。

    【讨论】:

      【解决方案2】:

      官方文档说:

      重复数据删除

      如果你使用一些带有很酷的依赖树的库,它可能会发生 有些文件是相同的。 Webpack 可以找到这些文件并 对它们进行重复数据删除。这可以防止将重复代码包含在 你的包,而是在运行时应用函数的副本。

      https://webpack.github.io/docs/optimization.html#deduplication

      我还没试过。

      【讨论】:

      • 太酷了!因此,如果我从 javascript 中两次包含相同的 css 文件,它将起作用。模块优化之前是否进行了预编译?我想这是一个更好的提问方式。 css 文件是被处理然后包含在模块系统中,还是首先被处理?如果首先处理它们,您最终会得到重复的代码,因为 cssFile1 和 cssFile2 都在内部包含 cssFile3。
      • 这对我来说太违反直觉了。这是否意味着如果不同的组件导入相同的文件,webpack 会复制 CSS 和 JS 代码?看到它已经导入了一个组件,这意味着它不需要再次导入它,这不是很聪明吗?在<head> 中注入多个相同的<style> 标签的整个想法对我来说似乎很疯狂。为什么不检测两个相同的导入并只注入一次,这样我们就不需要事后进行重复数据删除?
      猜你喜欢
      • 2017-09-19
      • 2020-01-10
      • 2018-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-25
      • 1970-01-01
      相关资源
      最近更新 更多