当前位置: 首页 > 面试题库 >

是否有基于React的项目的官方样式指南或命名约定?

夏侯渊
2023-03-14
问题内容

我正在与我的团队一起建立一个React项目,该项目将使用mobX作为状态管理器以及TypeScript。

我已经在React Projects的大小写和命名模式中看到了一个常见的模式:

  1. 非反应文件夹和文件:camelCasekebab-case
  2. 反应(在components文件夹内):PascalCase

在react中是否有文件夹/文件命名的正式约定?如果不是,是否有该样式所基于的样式指南?还是大多数情况下都使用此原因的原因?


问题答案:

只是加上我的两分钱。正如其他人所说,文件结构是不受限制的。但是,组件命名不是。他们 应该
PascalCase为应对知道你是否正在使用functionclassHTMLelement†。

例如:

class input extends Component {...}

不好 !为什么?因为React不知道您是要使用input元素还是基于类的组件。

这就是为什么您会看到PascalCase组件的原因:

class Input extends Component {...}

†有一个例外,您可以在其中使用dot notation。例如,如果您有多个导出并将它们全部导入为fields,则可以执行以下操作:

组件/字段/ index.js

import React, { Component } from 'react';

export class input extends Component {
  state = { value: "" };

  handleChange = ({ target: { value } }) => {
    this.setState({ value });
  };

  render = () => (
    <input type="text" value={this.state.value} onChange={this.handleChange} />
  );
}

export class textarea extends Component {
  state = { value: "" };

  handleChange = ({ target: { value } }) => {
    this.setState({ value });
  };

  render = () => (
    <textarea
      type="text"
      value={this.state.value}
      onChange={this.handleChange}
    />
  );
}

组件/App/index.js

import React, { Fragment } from 'react';
import * as fields from "../fields";

const App = () => (
  <Fragment>
     <fields.input />
     <fields.textarea />
   <Fragment>
);

export default App;

一般而言,我dot notation完全避免使用。感觉笨拙,可能会使其他不了解fields其结构的开发人员感到困惑。另外,我不喜欢在一个文件中堆叠多个组件,然后将它们作为一堆导入。此外,该文件可能会变得很大且导航和调试很麻烦(有关此内容,请参见下文)。

就是说,为了保持结构简单,我喜欢将主目录保持小写:

├── dist // compiled application files to be served
|   ├── css
|   |   ├── main.[contenthash:8].css
|   |   └── main.[contenthash:8].css.map
|   ├── js
|   |   ├── main.[hash].js // depending on app size, this may contain multiple js files for code splitting
|   |   └── main.[hash].js.map
|   ├── media
|   |   └── [hash].[ext] // static assets like fonts and images
|   └── favicon.ico
|   └── index.html
|
├── config // supporting "webpackdevserver" configuration files
|   ├── devServer.js
|   ├── envs.js
|   ├── optimization.js
|   ├── output.js
|   ├── paths.js
|   ├── plugins.js
|   └── rules.js
|
├── public
|   ├── favicon.ico
|   └── index.html
|
├── src
|   ├── actions // redux actions
|   ├── components // stateful and stateless reusable components that just display "stuff" -- stateful components change and manipulate the UI
|   ├── containers // stateful components that utilize the reusable "components" to CRUD data and/or are connected to redux
|   ├── images
|   ├── pages // utilize components/containers to display something when visiting a "/route"
|   ├── reducers // redux reducers
|   ├── root // aka "<App />" that combines "routes", redux and other top-level supporting files into one place
|   ├── routes // assigns "pages" to a "/route"
|   ├── styles // shared and/or global styles used by all "components"
|   ├── types // redux types
|   ├── utils // supporting app files: like test setup, custom polyfills, axios configurations, ...etc
|   └── index.js // a simple file that "ReactDOM.render"s the "App"
|
├── server.js // express setup to serve the "dist" folder
└── webpack.config.js

然后在该component文件夹中,我将PascalCase我的组件代表这样的东西:

└── components
    └── Input
        ├── __tests__
        |   └── Input.test.js // jest unit tests for "index.js"
        ├── index.js // all required code/styles to be exported
        └── styles.scss // styles required by "index.js"

为什么是这种结构?

  • 可重用的组件,可随时随地使用。
  • 与之相关的所有内容都Input包含在此文件夹中。因此,我可以将其交给某人,他们可以将其放入其应用程序中并使用它。
  • Webpack已设置为自动导入index.js,因此导入非常容易,而无需遍历大量嵌套文件:(import Input from 'components/Input';而且,js由于“ index.js”包含所有必需的代码,因此无需指定要使用的确切文件)。

缺点:

  • 您将有很多小文件夹。
  • 编译错误将全部包含index.js术语,因此乍一看对于“ index.js”失败的原因可能会有些困惑。

我曾经做过的另一种方法是:

└── components
    ├── input // lowercase name to delineate it's a "pure" function -- the actual function will be a PascalCased "Input"
    |   ├── input.test.js // jest unit tests for "input.js"
    |   ├── input.js // all required code/styles to be exported
    |   └── styles.scss // styles required by "input.js"
    |
    └── Sidebar // PascalCase because it's a "class"
        ├── Sidebar.test.js // jest unit tests for "Sidebar.js"
        ├── Sidebar.js // all required code/styles to be exported
        └── styles.scss // styles required by "Sidebar.js"

为什么是这种结构?

  • 可重用的组件,可随时随地使用。
  • 与之相关的所有内容都Input包含在此文件夹中。因此,我可以将其交给某人,他们可以将其放入其应用程序中并使用它。
  • 取决于主文件夹,它描述了组件是a function还是a class
  • 当发生编译错误时,我确切知道是哪个文件导致了该错误。

缺点:

  • 您将有很多小文件夹。
  • 有时组件可以从有状态变为无状态(反之亦然),因此,如果您严格要求并坚持使用这种命名模式,则必须更新主文件夹以反映更改,这意味着您还需要更新使用此组件的任何其他文件的路径。
  • 导入可能看起来有些冗长和冗长: import Input from 'components/input/input.js';

其他一般准则:

  • 避免默认导出匿名函数

默认导出的匿名函数的示例:

export default () => (
  <p>Anonymous Function</p>
);

为什么?因为在测试时,该功能将在酶中显示为:

<_default />

当一个组件中有多个匿名函数时,哪个是哪个!

<_default />
<_default />
<_default />
  • 避免使用冗长的文件(150行或更少的行),因为这会导致阅读/理解的痛苦,甚至会给调试带来更多的痛苦。

我发现, 通常情况 下,如果适当地进行优化, 大多数
组件将在100行以下。最坏的情况是我将不得不创建小的子组件来补充主组件。但!更容易阅读和调试

什么更容易阅读:

Example#1(34行带有辅助子组件)

Example#2(所有318行)

示例1模仿读书。粘贴在一起的多个页面可提供易于阅读的体验。与示例2相对,该示例读取的内容像一英里长的滚动条,很容易迷路!

  • 样式表可以是蛇形或驼峰式。

这可能会造成混淆,但是这完全取决于您如何应用样式。如果您只是这样导入样式:

import "./styles.css";

然后,您可以使用蛇形保护套:

<input className="snake-case" type="text" value="" onChange={this.handleChange} />

但是,如果您使用css modules,则需要使用camelCase:

import { camelCaseClassName } from "./styles.css";

为什么?因为捆绑器(如Webpack)不支持蛇形导入:

<input className={camelCaseClassName} type="text" value="" onChange={this.handleChange} />

结论:创建文件夹结构的方法有很多种,其中有一些提示和技巧来保持逻辑流程。只要选择一个最适合您并且不会干扰在您旁边工作的人!

换句话说,KISS ===“保持简单,愚蠢!”



 类似资料:
  • 例如,我试图了解他们是如何实现这种名为“灵活空间与图像”的酷滚动效果的(从这里开始):link。然而,无论我在哪里搜索,我找到的唯一东西是第三方库(就像这个)。 另一个例子是创建材料设计凸起按钮样式的方法(在这里发布) 我在android开发者博客上只找到了非常具体的元素的小片段(和更多的指导方针),例如这里和这里,但这不足以使用它,更不用说支持Lollipop前版本的android了(现在大多数

  • 问题内容: 这是我的方法: 表名是小写,下划线的用途来分隔词语,并且是单数(例如,等 我通常(并非总是)具有自动增量PK。我用下面的约定:(例如,等)。 当表包含作为外键的列时,我只需从它来自的任何表中复制该键的列名。例如,假设表格具有FK (的PK )。 在定义FK来强制引用完整性时,我使用以下代码:(例如,扩展示例3,它将是)。由于这是表名/列名的组合,因此可以保证它在数据库中是唯一的。 我按

  • coolie 这个单词有点儿意思,中英同音并且同义,义指“苦力”。现在,coolie 作为前端构建工具,它仍然是苦力(coolie)。 往常需要人为手动做的苦力活、重复活,现在都全部交给 coolie 来做。 因为 coolie 能够做的更好、更精确。

  • 本页提供 MOSN 文档的内容样式指南。 格式标准 必须使用 Markdown 格式编辑文档正文。 文档正文标题从二级标题开始。 图片使用本地图片,跟 index.md 文件放在同一个目录下,使用相对位置引用。 所有代码都需要指定代码语言。 中英文之间要加空格,如果句子末尾是英文则不需要。 请不要将有序列表和无序列表穿插混用,容易造成格式混乱。 对于直接出现的 URL 链接请使用 <URL> 包裹

  • 前端 我现在在初始化大部分项目的时候都会引入 AirBnb 的 JS 规范,不过其它公司的规范也值得仔细阅读,通常每一条规范的背后都有详细的解释,理解后能帮助提高代码水平以及了解自身的知识盲点。 阿里巴巴 Alice UI:中文 Google HTML/CSS 指南:中文 英文 DropBox CSS Style Guide:英文 中文 Airbnb 的 JS 规范:中文 英文 Trello 前端

  • 问题内容: 例如: 要么 这些名称或破折号有问题吗? 问题答案: 老实说,这取决于个人开发人员和他们自己的感受。就像您建议的那样,有两种同样好的构造CSS类的方法: 它们可以达到相同的目的,但是当您开始广泛思考时,您会发现这些样式之间的差距有多大。 分离班使他们可以重复使用: 该干的惯例是从不重复自己。通过分离or类,我们可以 重用 相同的类: 在第二种方法中-使用分隔符,代码将是: 在像这样的简