是否可以将装饰器与 create-react-app 一起使用?

Posted

技术标签:

【中文标题】是否可以将装饰器与 create-react-app 一起使用?【英文标题】:Is it possible to use decorators with create-react-app? 【发布时间】:2020-02-03 01:09:57 【问题描述】:

我知道由于 Babel 不支持开箱即用的装饰器(因为它处于定义的早期阶段)create-react-app 也不支持它。

我知道你可以弹出生成的应用程序并配置 Babel 以支持它们,但我不想这样做。

最后,像 MobX 这样的库允许您在不实际使用装饰器的情况下使用装饰器的行为,借助 https://mobx.js.org/best/decorators.html 中描述的一些实用功能

React 有类似的东西吗?

【问题讨论】:

【参考方案1】:

是的,你可以,但你需要一些东西,

确保您已安装 react-app-rewired 和 customize-cra,以便您可以覆盖 webpack 和 babel 配置

安装@babel/plugin-proposal-decorators

并更新您的config-overrides.js 文件:

const  override, addBabelPlugin  = require("customize-cra");
const pluginProposalDecorators = require("@babel/plugin-proposal-decorators");

module.exports = override(  
  addBabelPlugin(pluginProposalDecorators)
);

【讨论】:

对我来说,这失败了,因为插件要求设置其选项之一。假设您需要设置“decoratorsBeforeExport”或“legacy”(两个布尔选项),还是什么?我不知道。为了其他人对这些工具不熟悉,这就是最终的工作:我用“addBabelPlugin([pluginProposalDecorators, decoratorsBeforeExport: false])”替换了 override() 的参数,然后我参考了***.com/questions/52628207/… 来学习实际使用插件不会崩溃。【参考方案2】:

还可以通过将 tsconfig.json 文件添加到项目中来使用带有 create-react-app 的装饰器,这意味着启用对 typescript 的支持。您需要将 experimentalDecorators 设置为 true in tsconfig.json 的编译器选项希望我们知道 .js 和 .tsx 文件可以共存,所以无论我们想要使用装饰器的哪个文件,我们都可以转换为 .tsx 其余文件可以保留 .js 文件


    "compilerOptions": 
        "target": "esnext",
        "lib": ["dom", "dom.iterable", "esnext"],
        "allowJs": true,
        "skipLibCheck": true,
        "esModuleInterop": true,
        "allowSyntheticDefaultImports": true,
        "strict": true,
        "forceConsistentCasingInFileNames": true,
        "module": "esnext",
        "moduleResolution": "node",
        "resolveJsonModule": true,
        "isolatedModules": true,
        "noEmit": true,
        "jsx": "react",
        "noImplicitThis": false, 
        "experimentalDecorators": true,  //<---- 
        "types": ["cypress"]
    ,
    "include": ["src"]

【讨论】:

以上是关于是否可以将装饰器与 create-react-app 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

打字稿装饰器与类继承

装饰器与耦合聚合

Ruby on Rails 模式 - 装饰器与演示器

Python 迭代器与生成器及装饰器

装饰器与继承

迭代器与装饰器