首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >停止提取- CSS -块-webpack-插件从合并所有CSS

停止提取- CSS -块-webpack-插件从合并所有CSS
EN

Stack Overflow用户
提问于 2020-01-02 19:35:01
回答 2查看 2.5K关注 0票数 0

我正在使用Webpack 4建立一个简单的网站与一个快速后端。现在,我正在实现一个自定义元素,我面临一个关于影子DOM的问题。

问题如下:我所有的SCSS都被合并成一个CSS输出文件。我需要它保持独立,以便在元素连接时,可以动态地将自定义元素的样式添加到阴影DOM中。

我正在使用extract-css-chunks-webpack-plugin (我认为这是问题所在)、css-loaderpostcss-preset-envsass-loader来处理应用程序/站点中的所有SCSS。

到目前为止,我所做的所有搜索都让我找到了与我所需要的完全相反的东西(人们试图将他们的SCSS组合起来)。

我知道我可以单独构建自定义元素,然后在构建之后将它导入到项目中,但这意味着管理两个构建环境,然后必须对这两个环境进行版本控制--这似乎需要很大的开销。

该项目的文件夹结构如下:

代码语言:javascript
复制
root
--src/
----assets/
------js/
--------main.js
------scss/
--------main.scss
------web-components/
--------contact-modal.js
--------scss/
----------modal.scss

我现在的webpack开发配置如下:

代码语言:javascript
复制
    **omitted**

    module: {
        rules: [{
                test: /\.(scss)$/,
                use: [{
                        loader: ExtractCssChunksPlugin.loader,
                        options: {
                            hot: true,
                        }
                    },
                    {
                        loader: 'css-loader',
                        options: {
                            sourceMap: true,
                        }
                    },
                    {
                        loader: 'postcss-loader',
                        options: {
                            indent: 'postcss',
                            plugins: () => postcssEnv(),
                            sourceMap: 'inline',
                        },

                    },
                    {
                        loader: 'sass-loader',
                        options: {
                            sourceMap: true
                        }
                    }
                ]
            },

    **omitted**

    plugins: [
        new webpack.HotModuleReplacementPlugin(),
        new HtmlWebpackPlugin({
            template: 'src/views/pages/index.ejs',
            filename: 'index.html',
        }),
        new ExtractCssChunksPlugin({
            filename: 'assets/css/[name].css',
            chunkFilename: 'assets/css/[id].css',
        })
    ]

如果有一个更好的方式使用自定义元素,我忽略了,我会感谢任何反馈。

提前谢谢你。

编辑:

如图所示,我在contact-modal.js文件中包含了带有导入的modal.scss文件,这将是有益的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-15 11:48:03

为了解决我的问题,同时仍然使用SCSS (为了允许我使用供应商前缀从postcss-加载器),我最终用一个.modal标志前缀我的模态scss,所以modal.scss成为main.modal.scss

然后,我编辑了webpack配置,为scss文件设置了两个规则:一个只影响.scss文件,另一个影响.modal.scss

然后,在我的模型中,我用一个普通的import style from './main.modal.scss';导入了scss,然后将它附加到<style></style>元素中的影子DOM中。

守则如下:

新SCSS规则

代码语言:javascript
复制
                test: /(\.modal\.scss)$/,
                use: [
                    'css-loader',
                    {
                        loader: 'postcss-loader',
                        options: {
                            plugins: () => [ postcssPresetEnv() ],
                            sourceMap: 'inline'
                        }
                    },
                    'sass-loader'
                ]

修改的旧SCSS规则

代码语言:javascript
复制
                test: /(?<!\.modal)\.scss$/,
                use: [{
                        loader: ExtractCSSChunksPlugin.loader,
                        options: {
                            hot: true,
                        }
                    },
                    {
                        loader: 'css-loader',
                        options: {
                            sourceMap: true,
                            importLoaders: 3
                        }
                    },
                    {
                        loader: 'postcss-loader',
                        options: {
                            ident: 'postcss',
                            plugins: () => [
                                postcssPresetEnv()
                            ],
                            sourceMap: 'inline'
                        }
                    },
                    {
                        loader: 'sass-loader',
                        options: {
                            sourceMap: true,
                        }
                    }
                ]

在我的联系人-modal.js文件

代码语言:javascript
复制
import CSS from './scss/main.modal.scss';

    // ... omitted ...

    connectedCallback() {

    // ... omitted ...

    const style = document.createElement('style');
    style.innerHTML = CSS.toString();
    this.shadow.appendChild(style);

    // ... omitted ...
}
票数 0
EN

Stack Overflow用户

发布于 2020-01-02 20:56:06

我假设modal.scss正在导入main.scss?如果是这样的话,那么您的问题在于Sass编译器本身,而不是webpack。根据modal.scss中的内容,您可能希望使用@use

编辑1:

如果要在阴影DOM中添加编译后的css,比如一个<style>标记,可以用类似于到字符串加载程序的东西替换ExtractCSSChunks加载器。在js中,import style from "modal.scss";将把编译后的输出放在可以使用的字符串中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59569015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档