webpack 在使用 import 而不是 require 时不捆绑 scss

webpack not bundling scss when using import instead of require

简单的 webpack 设置,当我使用 import 加载我的 scss 时,它完全不在包中。应该导入的那一行根本就不见了。当我改用 require 时,它起作用了。

optimization: {usedExports: true} 不是问题,有和没有

我都试过了

mini-css-extract-plugin 也没有用。

当我在 s 中输入错字时css 它会抱怨,所以它被解析但最终没有捆绑?

index.js

require("./scss/style.scss");
//import "./scss/style.scss" <--- not working

import { createApp } from 'vue';
import App from './components/App.vue';

const el = document.getElementById('app');
createApp(App).mount(el);

webpack 配置

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const { VueLoaderPlugin } = require('vue-loader');
const { DefinePlugin } = require('webpack');

const dist = path.resolve(__dirname, "dist");

module.exports = env => {
    const mode = env.production == true ? "production" : "development";
    const devtool = mode == "production" ? false : "inline-source-map";

    return {
        mode: mode,
        entry: './web/index.js',
        output: {
            filename: 'bundle.js',
            path: dist
        },
        optimization: {
            usedExports: true,
        },
        devServer: {
            static: {
                directory: dist
            },
            port: 8888
        },
        module: {
            rules: [{
                test: /\.(sa|sc|c)ss$/,
                use: [
                    'style-loader',
                    'css-loader',
                    'sass-loader',
                ],
            }, {
                test: /\.(ttf|eot|woff|woff2|svg)$/,
                use: {
                    loader: 'file-loader',
                    options: {
                        name: '[name].[ext]',
                        outputPath: 'fonts/'
                    },
                },
            }, {
                test: /\.vue$/,
                loader: 'vue-loader'
            }]
        },
        plugins: [
            new CleanWebpackPlugin(),
            new DefinePlugin({
                __VUE_OPTIONS_API__: false,
                __VUE_PROD_DEVTOOLS__: false,
            }),
            new HtmlWebpackPlugin({
                template: path.resolve("./web/index.html")
            }),
            new VueLoaderPlugin()
        ],
        resolve: {
            extensions: ['.js'],
            alias: {
                "@": path.resolve(__dirname, 'web')
            }
        },
        devtool
    };
};

我发现了问题,但我不明白为什么 webpack 会丢弃它。

引自https://webpack.js.org/guides/tree-shaking/

Note that any imported file is subject to tree shaking. This means if you use something like css-loader in your project and import a CSS file, it needs to be added to the side effect list so it will not be unintentionally dropped in production mode:

在我的 package.json 我把

"sideEffects": false,

能够使用 treeshaking。
但是我不得不在加载程序规则中禁用它

{
  test: /\.(sa|sc|c)ss$/,
  use: ['style-loader','css-loader','sass-loader'],
  sideEffects: true <----
}