【问题标题】:How use the mini-css-extract-plugin to combine imported css and css generated from scss in a single file?如何使用 mini-css-extract-plugin 将导入的 css 和从 scss 生成的 css 合并到一个文件中?
【发布时间】:2018-10-26 19:22:43
【问题描述】:

我在 php 应用程序中使用 Webpack 4mini-css-extract-plugin。我将我编写的所有css 样式保留在scss 文件中,但是在某些情况下,当我导入一个外部库时,我会在我使用它的脚本中导入它的css。我的最终目标是将所有 css 样式放在一个 css 文件中,我可以手动将其包含在 php 视图中,但目前我将 scss 放在一个文件中,并将 css 从另一个文件中获取。

我当前的 webpack 配置是这样的:

module.exports = {
  devtool: 'source-map',
  entry: {
  style: './resources/assets/sass/style.scss',
  ...
},
 optimization: {
   splitChunks: {
     cacheGroups: {
       default: false,
        styles: {
          name: 'styles',
          test: /\.s?css$/,
          minChunks: 1,
          reuseExistingChunk: true,
          enforce: true,
        },
        commons: {
          test: /[\\/]node_modules[\\/]/,
          name: 'vendors',
          chunks: 'all',
          //minChunks: 2,
        },
      },
    },
  },
  module: {
    rules: [
      { 
        test: /\.css$/,
        use: [
          MiniCssExtractPlugin.loader,
          'css-loader',
        ],
      },
      {
        test: /\.scss$/,
        use: [
          'style-loader',
          MiniCssExtractPlugin.loader,
          'css-loader',
          {
            loader: 'postcss-loader',
            options: { config: { path: 'postcss.config.js' } },
          },
          'sass-loader',
        ],
      },
plugins: [
new MiniCssExtractPlugin({
      filename: '[name].[chunkhash].css',
    }), 
new webpack.ProvidePlugin({
     noUiSlider: 'nouislider',
   }),
]

scss 样式可以正常工作,但是在一个脚本中我有这个:

import 'nouislider/distribute/nouislider.css';

来自ProvidePlugin 中包含的脚本,这个css 最终出现在vendors.css 文件中,而我希望它与其余部分一起出现在style.css 中。

我做错了什么?

编辑: 按照建议,我创建了一个 github 存储库来重新创建问题:

https://github.com/carlotrimarchi/webpack-test

【问题讨论】:

  • 创建一个最小的 git repo 来重现你的问题,所以我们可以看看......
  • @Legends 我编辑了我的问题,添加了一个指向最小 github 存储库的链接。我包含了整个node_modules 目录,所以只需运行npm run build 就足够了
  • 您找到解决方案了吗?我有同样的问题。

标签: css webpack webpack-style-loader webpack-4 mini-css-extract-plugin


【解决方案1】:

@import '~nouislider/distribute/nouislider.css'; 添加到您的scss 文件之一。 无需使用 ProvidePlugin 导入 css。

(~) 符号告诉 webpack 查看 node_modules 文件夹。 您可以将此方法用于 node_modules 文件夹中的任何 css/scss 文件。

【讨论】:

  • 对不起,我的问题可能不清楚:插件NoUiSlider 是用ProvidePlugin 导入的,nouislider.css 文件是在脚本中导入的。
  • @Carlo 在您的 scss 文件之一中使用上述方法导入 css
  • 我只是尝试了你的方法,但它不起作用。使用我当前的 webpack 配置,直接在 main.scss 中导入 nouislider.css 会生成两个单独的 css
【解决方案2】:

编辑:

你想要:

...这个 css 最终出现在 vendor.css 文件中,而我希望它 与其余部分一起在 style.css 中。

使用 Gautams 答案。这一切左,右让我感到困惑。 只需将所有样式文件引用到一个scss 文件中,然后它们就会捆绑在一起。我仍然不明白你为什么在scripts.js 中单独导入nouislider...


第一:
entry: {
  style: './resources/assets/sass/style.scss',

style.css 不是您的应用程序的入口点,它是 script.js,因为它是您项目中唯一的 js 文件,除了 node_modules

webpack.config.js

 entry: {
        // style: './resources/assets/scss/main.scss',
        common: './resources/assets/js/script.js',
    },

在 wp4 中:插件、供应商脚本、css 文件不是应用程序的入口点!不要在entry下添加它们

你需要做什么:

1.) 如上所述更改您的入口点

2.) 删除 webpack.config.js 中的 optimization 部分。你不需要它。

3.) 删除ProvidePlugin(不需要)

4.) 在你的入口文件中导入样式:

scripts.js:

import "../scss/main.scss"
import 'nouislider/distribute/nouislider.css';

console.log('test')

样式按照您导入它们的顺序呈现。

WP4 会自动为您的应用创建优化的输出包。 因此,对于您的小测试 repo 和采用的更改 1-4,您将获得一个 js bundle 和一个 css bundle

【讨论】:

  • 我需要optimization,因为在真正的网站上,node_modules 中有许多入口点和许多库。将 scss 作为入口点真的有问题吗?我有很多入口点,我需要在所有入口点中都使用相同的 css
  • 您可以创建一个main.scss 文件,然后导入您想成为其中一部分的所有cssscss 文件,最后只在您的输入脚本中导入main.scss。您可以保留 optimization 部分,但对于这个小测试 repo,不需要它。
  • 当然可以,但我想让配置尽可能与实际配置相似。创建一个伪造的style.js 文件只是为了导入main.scsscss 并将其用作入口点是否可以接受?
  • AFAIK,它不是不应使用的入口点。目前 webpack 文档仍然指向 wp v3。 twitter.com/wSokra/status/969678282085060608
  • 我对这些解决方案的问题是,scss 的导入位置并不明显,我无法选择生成的文件名。这没什么大不了的,但奇怪的是我最终将css 命名为脚本,即使它们根本不相关
猜你喜欢
  • 2019-02-22
  • 2019-01-29
  • 2019-12-24
  • 2019-06-27
  • 2019-01-23
  • 2019-09-04
  • 2020-09-26
  • 2021-04-12
  • 2019-10-06
相关资源
最近更新 更多