草庐IT

React 大屏脚手架

东方三篇 2023-10-06 原文

1. 使用 create-react-app 初始化

# 使用了 create-react-app 的 typescript 模板
yarn create react-app my-big-screen --template typescript

# 初始化之后进入 my-big-screen 文件目录下执行
yarn start 

# localhost:3000 就能看到 react 的 hello 页面了

2. 引入 antd UI库

# 在 根目录 下
yarn add antd

3. 使用 craco 插件来自定义配置

  1. 安装 craco
yarn add @craco/craco
  1. 修改 package.json 文件如下

    # 原本
    "scripts": {
        "start": "react-scripts start",
        "build": "react-scripts build",
        "test": "react-scripts test",
        "eject": "react-scripts eject"
      }
    
    # 修改之后
    "scripts": {
        "start": "craco start",
        "build": "craco build",
        "test": "craco test",
        "eject": "craco eject"
      }
    
  1. 在根目录添加 craco.config.js 文件

    module.exports = {}
    

4. 自定义 antd 主题,使用 less 作为 css 预处理器

  1. 安装 craco-antd
yarn add craco-antd
  1. 修改 craco.config.js 文件

    const CracoAntDesignPlugin = require('craco-antd');
    
    module.exports = {
      plugins: [
        {
          plugin: CracoAntDesignPlugin,
          options: {
            customizeTheme: {
              '@primary-color': '#1DA57A',
            },
          },
        },
      ],
    };
    

5. 使用 craco-less .module.less 来模拟vue组件中style 的 scope 功能

  1. craco-less 依赖 已经内置在 @craco/craco 依赖中,无需主动安装

  2. 配置 craco.config.js 文件

    const CracoAntDesignPlugin = require('craco-antd')
    const CracoLessPlugin = require('craco-less')
    const { loaderByName } = require('@craco/craco')
    
    module.exports = {
     plugins: [
         {
             plugin: CracoAntDesignPlugin,
             options: {
                 customizeTheme: {
                     '@primary-color': '#1DA57A'
                 }
             }
         },
         {
             plugin: CracoLessPlugin,
             options: {
                 modifyLessRule(lessRule, context) {
                     // You have to exclude these file suffixes first,
                     // if you want to modify the less module's suffix
                     lessRule.exclude = /\.m\.less$/
                     return lessRule
                 },
                 modifyLessModuleRule(lessModuleRule, context) {
                     // Configure the file suffix
                     lessModuleRule.test = /\.m\.less$/
    
                     // Configure the generated local ident name.
                     const cssLoader = lessModuleRule.use.find(loaderByName('css-loader'))
                     cssLoader.options.modules = {
                         localIdentName: '[local]_[hash:base64:5]'
                     }
    
                     return lessModuleRule
                 }
             }
         }
     ]
    }
    
    
  1. 配置 * ./src/react-app-env.d.ts * 文件

    /// <reference types="react-scripts" />
    
    // 定义在 全局的 变量 然后就可以 window.* 进行访问了
    interface Window {
      __REDUX_DEVTOOLS_EXTENSION_COMPOSE__: any
      AMap: any
    }
    
    declare module "*.module.less" {
      const classes: { readonly [key: string]: string };
      export default classes;
    }
    
  1. 使用示例(类似vue scope 的效果)

    # index.module.less 文件命名
    app {
        font-size: 40px;
        color: #f00;
    }
    
    # 在组件中引入
    import styles from './index.module.less'
    
    <div className={styles['app']}>hello</div>
    

6. 使用 ESLint Prettier 两个插件来做代码格式校验和自动格式化

7. 以上操作版本记录

{
  "name": "xxx",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@craco/craco": "^6.2.0",
    "@testing-library/jest-dom": "^5.11.4",
    "@testing-library/react": "^11.1.0",
    "@testing-library/user-event": "^12.1.10",
    "@types/jest": "^26.0.15",
    "@types/node": "^12.0.0",
    "@types/react": "^17.0.0",
    "@types/react-dom": "^17.0.0",
    "@types/react-router-dom": "^5.1.8",
    "@typescript-eslint/eslint-plugin": "^4.30.0",
    "@typescript-eslint/parser": "^4.30.0",
    "antd": "^4.16.13",
    "craco-antd": "^1.19.0",
    "eslint": "^7.32.0",
    "eslint-config-alloy": "^4.3.0",
    "eslint-loader": "^4.0.2",
    "eslint-plugin-react": "^7.25.1",
    "react": "^17.0.2",
    "react-dom": "^17.0.2",
    "react-redux": "^7.2.4",
    "react-router-dom": "^5.2.1",
    "react-scripts": "4.0.3",
    "typescript": "^4.1.2",
    "web-vitals": "^1.0.1"
  },
  "scripts": {
    "start": "set PORT=3090 && craco start",
    "build": "craco build",
    "test": "craco test",
    "eject": "craco eject",
    "lint": "eslint '{src}/**/*.{ts,tsx,js,jsx}'",
    "lint_fix": "eslint {src} --ext .ts,.tsx,.js,jsx --fix"
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  }
}

有关React 大屏脚手架的更多相关文章

  1. ruby-on-rails - 如何在 Rails 3 中创建自定义脚手架生成器? - 2

    有这些railscast。http://railscasts.com/episodes/218-making-generators-in-rails-3有了这个,你就会知道如何创建样式表和脚手架生成器。http://railscasts.com/episodes/216-generators-in-rails-3通过这个,您可以了解如何添加一些文件来修改脚手架View。我想把两者结合起来。我想创建一个生成器,它也可以创建脚手架View。有点像RyanBates漂亮的生成器或web_app_themegem(https://github.com/pilu/web-app-theme)。我

  2. ruby-on-rails - Ruby 长时间运行的进程对队列事件使用react - 2

    我有一个将某些事件写入队列的Rails3应用。现在我想在服务器上创建一个服务,每x秒轮询一次队列,并按计划执行其他任务。除了创建ruby​​脚本并通过cron作业运行它之外,还有其他稳定的替代方案吗? 最佳答案 尽管启动基于Rails的持久任务是一种选择,但您可能希望查看更有序的系统,例如delayed_job或Starling管理您的工作量。我建议不要在cron中运行某些东西,因为启动整个Rails堆栈的开销可能很大。每隔几秒运行一次它是不切实际的,因为Rails上的启动时间通常为5-15秒,具体取决于您的硬件。不过,每天这样做几

  3. ruby-on-rails - 如何在 Rails 脚手架生成器上强制使用单数表名? - 2

    我正在使用遗留数据库并需要创建一些CRUD。我如何使用scaffold生成器并告诉他表的确切名称以避免复数化过程?表格也是西类牙语。 最佳答案 您可以只使用ActiveRecord::Base.table_name=方法手动设置表名。因此,在您的模型中您可以:classOrderDetail 关于ruby-on-rails-如何在Rails脚手架生成器上强制使用单数表名?,我们在StackOverflow上找到一个类似的问题: https://stackove

  4. ruby - 单个 EventMachine react 器中的多个服务器 - 2

    是否可以在单个事件机器中运行多个服务器?我的意思是,多个服务可以由一个客户端连接同时使用。例如,登录服务器对用户进行身份验证,然后用户可以同时使用聊天室和简单的游戏,例如带有单个客户端套接字的跳棋?或者我是否需要为每个服务使用多个事件机器react器? 最佳答案 我试过了,它正在工作:#!/usr/bin/envrubyrequire'eventmachine'moduleEchoServerdefpost_initputs"--someoneconnectedtotheechoserver!"enddefreceive_datad

  5. ruby-on-rails - Ruby On Rails 脚手架需要包含外键吗? - 2

    我正在学习ruby​​onrails的基础知识,我想做一些简单的查询,但我有疑问:我将拥有这些模型:classClient现在,我将使用脚手架来生成所有的东西,我想知道我是否必须直接将外键放在脚手架中,例如:rails生成脚手架地址street:stringnumber:integerclient_id:integer或者当我建立这些关联然后迁移我的数据库时,它们将是隐式的?我不知道我是否以最好的方式解释了自己。谢谢 最佳答案 是的,没有引用。您需要传递client_id或对Client模型的引用,例如:railsgenerates

  6. ruby-on-rails - "cafe"的 Rails 脚手架多元化不正确 - 2

    我想创建一个cafe和一个caveController。当我尝试通过命令使用rails脚手架创建我的cafe时railsgscaffoldcafename:string它将“cafe”的复数形式派生为“caves”,这意味着我无法制作我的cavesController,因为该名称已被使用。如何使Rails使用正确的复数形式? 最佳答案 您可以创建自己的变形。将此添加到您的config/initializers/inflections.rbActiveSupport::Inflector.inflectionsdo|inflect|i

  7. ruby-on-rails - 生成脚手架时跳过 jbuilder 文件? - 2

    当我搭建脚手架时,我不希望它生成这些文件:invokejbuildercreateapp/views/tests/index.json.jbuildercreateapp/views/tests/show.json.jbuilder但是怎么办?在我的application.rb我有这个:config.generatorsdo|g|g.assetsfalseg.helperfalseg.test_frameworknilend 最佳答案 使用config.generators.jbuilder=false或config.generat

  8. React通过classnames库添加类 - 2

    React添加Class的方式在vue中添加class是一件非常简单的事情:你可以通过传入一个对象,通过布尔值决定是否添加类:button:class="{active:isFlag,aaa:true}">按钮button>你也可以传入一个数组:h2:class="['aaa','bbb']">HelloVueh2>h2:class="[className1,className2]">HelloVueh2>甚至是对象和数组混合使用:h2:class="['aaa',{active:isFlag}]">HelloVueh2>而在React中就相对繁琐了,React在JSX给了我们开发者足够多的灵

  9. ruby-on-rails - 通过 ruby​​onrails 中的脚手架设置对表的引用 - 2

    我现在正在做一个关于ruby​​onrails的项目。我创建了一个名为product的实体,我想设置与其他名为category的实体的多对多关系。script/generatescaffoldproductprd_name:stringcategory:references通过执行此代码,只能进行一对一映射。如何在不进行硬编码的情况下设置多对多? 最佳答案 您不应期望仅通过脚手架就能生成您的应用程序。它只是为了提供入门示例。Rails中最灵活的多对多关系称为hasmanythrough.这需要一个连接表,在这种情况下通常称为“分类”

  10. 如何使React Router V4路由与React Transition Group(低级API)一起使用 - 2

    从ReactRouterV3过渡到V4后,我再也无法使ReactTransition组低级API工作。React路由器的文档显示了与CSS动画相关的高级API的示例,这些示例与低水平的JS风味不起作用。任何人都设法或知道让这个工作?看答案已经一个月了,所以我想您找到了自己的出路,但可能会对他人有所帮助。我创建了这个:https://www.npmjs.com/package/reeact-router-v4-transition在我遇到同样的问题之后。它在开关组件中提供了一种过渡组。从将开关更改为TransitionSwitch的Appart,它不需要大幅度更改。我将在接下来的几天(可能是星期

随机推荐