Непосредственно импортированный файл CSS из узловых модулей странным образом пропадает

Я столкнулся с очень своеобразной проблемой при попытке импортировать файл CSS из модуля узла.

В моем файле App.tsx у меня есть

import './App.css';                       // works
import '@foo/my-dependency/dist/foo.css'; // doesn't work

В то время как импорт локального файла CSS работает хорошо, импорт foo.css из модуля узла не работает вообще, но ошибки компиляции не наблюдается.

И если я изменю эту строку на синтаксис require, она будет работать нормально.

require('@foo/my-dependency/dist/foo.css'); // works

И если я изменю его на модуль CSS, такой как синтаксис, он тоже сработает.

import style from '@foo/my-dependency/dist/foo.css'; // works
console.log(style);     // to ensure the imported stuff is used at least once

Обратите внимание, что для поддержки выше мне нужно добавить объявление типа модуля CSS, как указано здесь.

Я не уверен, где именно это происходит не так. Моя конфигурация Webpack для правил модуля выглядит так, как показано ниже. И я использую сервер разработки webpack для тестирования. Версия веб-пакета 5.23.0.

  module: {
    rules: [
      {
        test: /\.(jsx?|tsx?)$/,
        exclude: /node_modules/,
        loader: 'babel-loader',
      },
      {
        test: /\.s?css$/,
        use: [
          'style-loader',
          'css-loader',
          'postcss-loader',
          'sass-loader',
        ],
      }
    ],
  },

person Ruifeng Ma    schedule 22.05.2021    source источник


Ответы (1)


Иногда я действительно удивляюсь, насколько хорошо я умею спотыкаться. Это вызвано настройкой sideEffects: false, которую я поместил в файл package.json моего пакета зависимостей для поддержки встряхивания дерева Webpack. Это специально упоминается в документе . что css/scss файлы должны быть помечены как побочные эффекты на случай, если они будут удалены из-за нежелательного результата. После смены на sideEffects: ["*.css"] все работает.

Также неудивительно, что два других рабочих решения, которые я перечислил выше, действительны, потому что, когда Webpack выполняет встряхивание дерева, он проходит через операторы import, начиная с входного файла. Если это не оператор import или специально используется импортированный материал, встряхивание дерева, безусловно, не сработает.

person Ruifeng Ma    schedule 22.05.2021