Create-react-app + TypeScript + CSS 模块:自动生成类型定义而不从 CRA 中弹出

Posted

技术标签:

【中文标题】Create-react-app + TypeScript + CSS 模块:自动生成类型定义而不从 CRA 中弹出【英文标题】:Create-react-app + TypeScript + CSS Modules: Auto-generating type definitions without ejecting from CRA 【发布时间】:2020-02-11 06:33:46 【问题描述】:

问题

create-react-app v2+ 支持开箱即用的 TypeScript 和 CSS 模块......分别。当您尝试将两者结合使用时,就会出现问题。 Facebook had an extensive discussion 关于这个问题并最终在 GitHub 上将其关闭。因此,开发人员必须使用 hack 和其他变通方法来让这两种技术与 CRA 一起很好地发挥作用。

现有解决方法

您可以手动创建具有如下类型定义的ComponentName.module.css.d.ts 文件:export const identifierName: string。这允许您在导入 ComponentName.module.css 时利用 TypeScript 的键入和 VS Code 的自动完成功能。不幸的是,这非常乏味。

解决方案 (?)

Dropbox 的人们创建了typed-css-modules-webpack-plugin 来解决这个问题;它会为您自动生成那些*.d.ts 文件。他们展示了如何使用yarnnpm 安装它,然后给出这个最小的代码示例:

const path = require('path');
const TypedCssModulesPlugin = require('typed-css-modules-webpack-plugin');

module.exports = 
  entry: './src/index.ts',
  output: 
    path: path.resolve(__dirname, 'dist'),
    filename: 'bundle.js',
  ,
  module: 
    rules: [
      
        test: /\.tsx?$/,
        loader: 'ts-loader',
      ,
      
        test: /\.css$/,
        use: [
          'style-loader',
          // Use CSS Modules
          
            loader: 'css-loader',
            options: 
              modules: true,
            ,
          ,
        ],
      ,
    ],
  ,
  // Generate typing declarations for all CSS files under `src/` directory.
  plugins: [
    new TypedCssModulesPlugin(
      globPattern: 'src/**/*.css',
    ),
  ],
;

不幸的是,目前尚不清楚如何将其与create-react-app 一起使用。我对 Webpack 不是很了解,我使用customize-cra 来避免退出create-react-app,所以我可以为我需要的一些东西自定义 Webpack 配置。例如,Ant Design 允许您使用 babel-plugin-import 按需导入组件,详情如下:

https://ant.design/docs/react/use-in-typescript#Use-babel-plugin-import

问题:如何将上述 Webpack 配置代码转换为 customize-cra 等效项,这样我就不必退出 CRA?

【问题讨论】:

【参考方案1】:

好吧,正如 AlexH 所说,一切都是正确的。 tsconfig.ts 中的 1 个。


  "compilerOptions": 
    "plugins": [ "name": "typescript-plugin-css-modules" ]
  

global.d.ts 中的 2 个

declare module '*.module.less' 
  const classes:  [key: string]: string ;
  export default classes;

    但你也应该在 tsconfig 中写
 "include": [
    "global.d.ts",
     ...
  ]

【讨论】:

【参考方案2】:

好的,所以我最终弄清楚了这一点,并为遇到类似问题的任何人写了一篇关于该主题的博客文章:

https://aleksandrhovhannisyan.github.io/blog/dev/how-to-set-up-react-typescript-ant-design-less-css-modules-and-eslint/#3-create-react-app-css-modules-and-typescript-

该解决方案使用typescript-plugin-css-modules 插件。以下是我博客文章中的相关内容:

yarn add -D typescript-plugin-css-modules

安装后,将插件添加到您的 tsconfig.json 中:


  "compilerOptions": 
    "plugins": [ "name": "typescript-plugin-css-modules" ]
  

接下来,在您的 src 目录下创建一个名为 global.d.ts 的文件。顺便说一句,您不必将其命名为 global;您可以随意命名文件,只要它具有.d.ts 扩展名。输入这些内容:

declare module '*.module.less' 
  const classes:  [key: string]: string ;
  export default classes;

如果您还想使用 SASS 或 CSS,只需添加更多模块声明并更改 .less 扩展名。

我们快完成了!根据插件的使用说明,如果您希望智能感知在 VS Code 中工作,您需要强制 VS Code 使用您的工作区版本的 TypeScript,而不是全局安装的版本。还记得我们一开始通过 CRA 安装 TypeScript 的时候吗?这是我们的 TypeScript 工作区版本。

下面是如何在 VS Code 中使用工作区版本的 TypeScript:

    打开任何 TypeScript 文件。

    点击VS Code底部蓝色状态栏的版本号。

    选择使用工作区版本(撰写本文时为 3.7.3)。

这里有一个屏幕截图可以更清楚地说明:

完成此操作后,VS Code 将在您的项目中创建一个 .vscode 目录用于工作区设置。

此时,您已准备好将 CSS 模块与 TypeScript 一起使用。

【讨论】:

感谢亚历克斯,您的链接无效.. 更新链接aleksandrhovhannisyan.com/blog/dev/… 此解决方案有效。问题所有者应将此标记为答案...谢谢亚历克斯 @alexh 你的 rlobg 帖子已关闭 我真的需要以下部分吗? 常量类: [key: string]: string ;导出默认类; 没有它,仍然为我工作 按照这个和 Gorr1995s 调整,仍然没有工作......

以上是关于Create-react-app + TypeScript + CSS 模块:自动生成类型定义而不从 CRA 中弹出的主要内容,如果未能解决你的问题,请参考以下文章

create-react-app (发现不兼容的模块)

使用 create-react-app 脚手架搭建 react 项目,释放配置文件且注入 less 依赖

sh 用于将工作证书链接到create-react-app的脚本。允许您使用create-react-app和有效的SSL证书。

create-react-app:如何使用 https 而不是 http?

create-react-app + nodejs (express) 服务器

create-react-app 中的“npm run build”是啥?