Как я могу импортировать модули CSS в файл TypeScript?

Я внес некоторые изменения, которые перечислены ниже.

Я работаю с комбинацией React (18.2.0), Typescript (4.8.4) и Webpack (5.75.0). Я пытаюсь добавить стиль в свое приложение и пытаюсь использовать модули CSS. Я пробовал несколько конфигураций Webpack, и ни одна из них не заставляет Webpack использовать правильный загрузчик. Я пробовал несколько других вариантов загрузчиков (как видно из закомментированных разделов), и ни один из них не работает.

Я использую подход, аналогичный этому ответу для импорта таблиц стилей (объявление src/Globals.d.ts, установка плагина компилятора typescript-plugin-css-modules для tsc и импорт как import * as styles from './styles.module.css')

Импорт таблицы стилей

import * as styles from './ResultCount.module.css'

export const ResultCount = () => {
  const orders = useSelector((state: ReducedState) => state.all.orders)
  console.info('result count style name', styles.results) // always undefined

  return <p className = {styles.results}>

src/Globals.d.ts

declare module '*.module.css'

Это ошибка, которую я получаю независимо от используемой конфигурации загрузчика.

cached modules 1.59 MiB (javascript) 27.4 KiB (runtime) [cached] 131 modules
./src/components/Order/styles.module.css 96 bytes [built] [1 error]

ERROR in ./src/components/Order/styles.module.css 1:0
Module parse failed: Unexpected token (1:0)
You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders
> .order {
...

Может ли кто-нибудь сказать мне, что я делаю неправильно в моем файле webpack.config.ts?

  module: {
    rules: [
      {
        test: /\.tsx?$/,
        loader: 'ts-loader',
        options: {
          transpileOnly: true
        },
        exclude: /dist/
      },
      {
        test: /\.css$/,
        use: [
          "style-loader",
          {
            loader: "css-loader",
            options: {
              modules: true,
              importLoaders: 1,
              localIdentName: "[name]_[local]_[hash:base64]",
              sourceMap: true,
              minimize: true
            }
          }
        ]
      },
      // {
      //   test: /\.css$/,
      //   include: path.join(__dirname, 'src/components'),
      //   loader: 'css-loader',
      //   //use: ['style-loader', 'css-loader']
      //   // use: [
      //   //   'style-loader',
      //   //   {
      //   //     loader: 'typings-for-css-modules-loader',
      //   //     options: {
      //   //       modules: true,
      //   //       namedExport: true
      //   //     },
      //   //   },
      //   //   'css-loader',
      //   // ],
      // },
    ]
  },

Редактировать

Я обнаружил, что сервер веб-пакетов должен быть перезапущен, чтобы такие изменения вступили в силу (даже при включенной перезагрузке). Новая проблема заключается в следующем: хотя Webpack успешно строится, но любой импорт классов в файлах .ts возвращает undefined. Таким образом, ни один из стилей не применяется. Я обновил заголовок, чтобы отразить новую проблему.

Странно то, что мой языковой сервер (tsserver) может автоматически завершать классы, определенные в файле .css, из import * as styles from './styles.module.css', но если я использую console.info() перед тем, как вернуть свой TSX, я всегда вижу неопределенное значение. Я убедился, что искаженные имена модулей CSS находятся на окончательно отображаемой странице, найдя встроенные стили в инспекторе браузера. Я также попытался объявить файл styles.module.css.d.ts (хотя мне это не нужно из-за плагина Typescript) на всякий случай, но это все равно не решило проблему. Я также пытался (из этого ответа) переименовать из styles.module.css в <component name here>.module.css, но это тоже не сработало.

Кто-нибудь знает, что может быть причиной этого?

Вы не показали код, который фактически импортирует стили. Также import * as SymbolName и import SymbolName имеют разную семантику.

Biller Builder 15.11.2022 09:04

@BillerBuilder отредактирован, чтобы предоставить больше кода

David 15.11.2022 18:26

@BillerBuilder изменился на import styles from './ComponentNameHere.modules.css, и это styles.cssClassNameHere сработало. Спасибо. Можете ли вы повторно отправить ответ, чтобы я мог его принять?

David 16.11.2022 03:18
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
2
3
567
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

import * as styles from "module-path"; семантически отличается от import styles from "module-path";. По сути, не думайте, что эти модули, созданные не на основе javascript, следуют каким-либо расширенным правилам модуля и всегда импортируют их по умолчанию.

Другие вопросы по теме