从节点模块直接导入的 CSS 文件奇怪地丢失了

Posted

技术标签:

【中文标题】从节点模块直接导入的 CSS 文件奇怪地丢失了【英文标题】:Directly imported CSS file from node modules oddly go missing 【发布时间】:2021-08-11 09:04:36 【问题描述】:

我在尝试从节点模块导入 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 模块类型声明,如 here 所述。

我不确定它到底哪里出错了。我在模块规则上的 Webpack 配置如下所示。我使用 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',
        ],
      
    ],
  ,

【问题讨论】:

【参考方案1】:

有时我真的很惊讶自己在绊倒自己方面做得多么出色。这是由我放入依赖包的package.json 文件中的sideEffects: false 设置引起的,以支持Webpack 摇树。 doc 中特别提到 css/scss 文件需要标记为副作用,以防它们被修剪为不需要的结果。更改为sideEffects: ["*.css"] 后一切正常。

我上面列出的其他两个可行的解决方案也是有效的也就不足为奇了,因为当 Webpack 进行树摇动时,它会从入口文件开始遍历 import 语句。如果不是import 声明或者是专门使用了导入的东西,肯定tree shaking 不会生效。

【讨论】:

以上是关于从节点模块直接导入的 CSS 文件奇怪地丢失了的主要内容,如果未能解决你的问题,请参考以下文章

节点模块的 CSS

Typescript 从节点模块导入 ts 文件

使用 webpack 从节点模块加载 CSS 文件

从 Nuxt.js 与 PhpStorm 中的节点模块解析 SCSS 中的 @import .css

从 Gitlab 私有存储库导入节点模块时出错

Redis学习笔记33——脑裂:奇怪的数据丢失