Настройте модули с помощью Sass + CSS-Modules + Webpack + React + Ts

У меня проблема с получением типов из моих файлов .scss. Я ищу и пытаюсь реализовать разные конфигурации, но ничего не помогает.

По сути, я пытаюсь использовать модули в реагирующем приложении с TS.

это мой вебпак

import { join } from "path";
import HtmlWebpackPlugin from "html-webpack-plugin";
export const mode = "development";
export const entry = "./src/index.tsx";
export const devtool = "inline-source-map";
export const output = {
  path: join(__dirname, "/dist"),
  filename: "bundle.js",
};
export const devServer = {
  static: "./dist",
};
export const module = {
  strictExportPresence: true,
  rules: [
    {
      test: /\.jsx?$/,
      exclude: /node_modules/,
      loader: "babel-loader",
    },
    {
      test: /\.tsx?$/,
      use: "ts-loader",
      exclude: /node_modules/,
    },
    {
      test: /\.s[a|c]ss$/i,
      use: [
        { loader: "style-loader" },
        {
          loader: "css-loader",
          options: {
            minimize: true,
            camelCase: "dashes",
            modules: true,
            localIdentName: "[name]__[local]___[hash:base64:5]",
          },
        },
        {
          loader: "postcss-loader",
          options: {
            plugins: function () {
              return [require("autoprefixer")];
            },
          },
        },
        { loader: "sass-loader" },
      ],
    },
  ],
};
export const resolve = {
  extensions: [".tsx", ".ts", ".js"],
};
export const plugins = [
  new HtmlWebpackPlugin({
    template: "./index.html",
  }),
];

это пакет json

{
  "name": "mma-web",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@babel/preset-env": "^7.21.5",
    "@babel/preset-react": "^7.18.6",
    "@fortawesome/fontawesome-svg-core": "^6.4.0",
    "@fortawesome/free-brands-svg-icons": "^6.4.0",
    "@fortawesome/free-solid-svg-icons": "^6.4.0",
    "@fortawesome/react-fontawesome": "^0.2.0",
    "@testing-library/jest-dom": "^5.16.5",
    "@testing-library/react": "^13.4.0",
    "@testing-library/user-event": "^13.5.0",
    "@types/jest": "^27.5.2",
    "@types/jquery": "^3.5.16",
    "@types/node": "^16.18.23",
    "@types/react": "^18.0.35",
    "@types/react-dom": "^18.0.11",
    "axios": "^1.3.5",
    "babel-loader": "^9.1.2",
    "bootstrap": "^5.2.3",
    "css-loader": "^6.7.3",
    "css-modules-typescript-loader": "^4.0.1",
    "html-webpack-plugin": "^5.5.1",
    "jquery": "^3.6.4",
    "npm-watch": "^0.11.0",
    "react": "^18.2.0",
    "react-bootstrap": "^2.7.4",
    "react-dom": "^18.2.0",
    "react-router-dom": "^6.10.0",
    "react-scripts": "5.0.1",
    "rollup-plugin-lit-css": "^4.0.1",
    "style-loader": "^3.3.2",
    "ts-loader": "^9.4.2",
    "typescript": "^4.9.5",
    "typescript-plugin-css-modules": "^5.0.1",
    "web-vitals": "^2.1.4",
    "webpack": "^5.82.0",
    "webpack-cli": "^5.0.2",
    "webpack-dev-server": "^4.13.3"
  },
  "watch": {
    "build": {
      "patterns": [
        "src"
      ],
      "extensions": "js,jsx, ts, tsx, scss, sass, css"
    }
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject",
    "watch": "npm-watch && react-scripts start"
  },
  "eslintConfig": {
    "extends": [
      "react-app",
      "react-app/jest"
    ]
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  },
  "devDependencies": {
    "@babel/cli": "^7.21.5",
    "@babel/core": "^7.21.8",
    "babel-plugin-css-modules-transform": "^1.6.2",
    "babel-preset-env": "^1.7.0",
    "mini-css-extract-plugin": "^2.7.5",
    "node-sass": "^7.0.3",
    "sass": "^1.62.1",
    "sass-loader": "^13.2.2",
    "typed-scss-modules": "^7.1.0"
  }
}

а это тсконфиг

{
  "compilerOptions": {
    "target": "es5",
    "lib": ["dom", "dom.iterable", "esnext"],
    "allowJs": true,
    "skipLibCheck": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "strict": true,
    "forceConsistentCasingInFileNames": true,
    "noFallthroughCasesInSwitch": true,
    "module": "esnext",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "noEmit": true,
    "jsx": "react-jsx",
    "checkJs": true
  },
  "include": ["src", "*.scss"]
}

И ничего не работает. Пакеты для scss с расширением *.d.ts не создает

УПД: Хорошо, в vs code я изменил свою машинописную версию на локальную, и она начала показывать мне классы css и правильно их реализовывать. Но пока они не скомпилированы и вебпак их не видит.

Я добавил эти строки в tsconfig

...,
"plugins": [
      {
        "name": "typescript-plugin-css-modules"
      }
    ]

См. Как задать вопрос, а затем измените заголовок сообщения, чтобы задать четкий, конкретный вопрос, а не просто список ключевых слов.

isherwood 12.05.2023 21:01
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
1
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы настраиваете машинописный текст, чтобы не создавать файлы объявлений, устанавливая «noEmit»: true,

Измените его на emitDeclarationOnly: true

Это позволит Ts-загрузчику, который запускается перед загрузчиком babel, выдавать только файлы объявлений, а не транспилировать код Ts.

С этого момента загрузчик Babel возьмет на себя ответственность.

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