使用 Plop.js 以光速创建 React 组件
你在 React 应用中工作,现在到了创建新组件的时候,你已经完成了所有步骤。进入组件文件夹,创建一个索引文件,再创建一个样式文件,最后再创建一个测试文件,因为你觉得很酷。完成所有这些之后,你仍然需要连接这些文件并编写足够的代码来使它们运行。你每次都这样做……每次都这样做。
我假设了很多,但如果这真的是你,那我有个好消息!
如果我告诉你有办法自动化这个无聊乏味的过程,你会怎么想?
相信我,接下来的10分钟将改变你的人生。让我来向你介绍plop.js。
什么是 Plop.js?
用他们自己的话说,它是一种可以节省您的时间并帮助您一致地构建新文件的工具。
它是如何工作的?
这比你想象的要简单,不然我也不会写这篇文章了,哈哈。你只需要创建文件模板,并配置一个非常简单的命令行界面即可。
让我们开始吧
首先,让我们克隆这个简单的反应应用程序,它只有一个基本的反应设置。
git clone git@github.com:ivanms1/parcel-template.git
并导航至该
cd parcel-template
现在让我们安装 plop,在终端上输入:
yarn add plop
# or
npm install plop
生成器
接下来,在根文件夹上创建一个名为的文件plopfile.js
,并在其中添加以下内容。
module.exports = function (plop) {
plop.setGenerator("component", {
description: "Create a component",
prompts: [
{
type: "input",
name: "name",
message: "What is this component's name?",
},
{
type: "input",
name: "element",
message: "HTML element (div is default)",
default: "div",
},
],
actions: [
{
type: "add",
path: "src/components/{{pascalCase name}}/{{pascalCase name}}.tsx",
templateFile: "templates/Component.tsx.hbs",
},
],
});
};
我们基本上是在配置一个命令行来生成文件。plop.setGenerator
创建一个生成器,第一个参数是生成器的名称,第二个参数是一个包含一些选项的对象,我们可以在其中配置要生成的内容。让我们分析一下本指南中将要用到的选项。
description
非常不言自明,对你的生成器的描述,例如:反应组件的生成器。
prompts
我们向用户提供的一系列步骤、问题或指令,用于获取特定信息。Plop 将这些存储在变量中,以便稍后在模板文件中使用。
在我们的例子中,我们使用input
类型提示来获取
- 组件的名称。
- 组件的html标签(div、button、a等),默认为div。
message
是用户将看到并必须与之交互的文本,通常是一个问题或一个指令。
actions
收集到所有需要的信息后,我们继续执行以数组形式表示的操作。在本例中,只有一个创建文件的操作。
让我们更详细地了解一下这些操作,因为这些操作才是真正发生事情的地方。add
创建文件的操作类型,path
简单来说就是要创建文件的文件路径。这template
是一种用于创建文件的框架。Plop 使用handlebars,这是一种可以生成 HTML 和其他文本格式的模板语言。
您可能已经注意到我们还没有创建模板文件,是的......我们需要这样做。
创建我们的第一个模板
在根文件夹上创建一个名为的文件夹templates
,并添加一个名为的文件,Component.tsx.hbs
其内容如下。
import React from "react";
interface {{pascalCase name}}Props {}
const {{pascalCase name}} = () => {
return <div>{{pascalCase name}}</div>;
};
export default {{pascalCase name}};
你可能已经猜到了,我们正在创建一个 React TypeScript 文件,在 Handlebars 中,变量位于双括号 ( {{}}
) 内。它将我们从提示符中获取的变量pascalCase
转换为 Pascal 命名格式。因此,你在任何位置看到的 都会被替换为组件的名称。name
{{pascalCase name}}
虽然这很酷,但到目前为止,我们只是创建了一个包含一些预先编写好的 React 代码的新文件。有一些代码片段扩展可以实现几乎相同的功能。让我们再添加一个样式文件,让它更完整一些。
添加样式文件
我将使用stitches,这是一个类似于样式组件但运行时间接近于零的 css-in-js 库,但您可以随意使用任何您想要的。
让我们首先安装库,在终端运行:
yarn add @stitches/react
# or
npm install @stitches/react
由于我们现在还想创建一个样式文件,因此需要action
在生成器中添加另一个样式文件。更新plopfile.js
内容如下。
actions: [
{
type: "add",
path: "src/components/{{pascalCase name}}/{{pascalCase name}}.tsx",
templateFile: "templates/Component.tsx.hbs",
},
// new action here
{
type: "add",
path: "src/components/{{pascalCase name}}/styles.ts",
templateFile: "templates/styles.ts.hbs",
},
],
与第一个非常相似action
,现在我们需要添加一个新模板。在templates
文件夹中创建一个名为的文件styles.ts.hbs
,并添加以下内容。
import { styled } from '@stitches/react';
export const Styled{{pascalCase name}} = styled('{{element}}', {});
只需您的基本 css-in-js 文件,我们即可创建一个样式组件并将其导出。
Component.tsx.hbs
需要更新,所以它导入并使用了我们制作的新样式组件。现在它应该如下所示:
import React from "react";
import { Styled{{pascalCase name}} } from "./styles";
interface {{pascalCase name}}Props {}
const {{pascalCase name}} = ({} : {{pascalCase name}}Props) => {
return <Styled{{pascalCase name}}>{{pascalCase name}}</Styled{{pascalCase name}}>;
};
export default {{pascalCase name}};
现在我们正在讨论,plop 为我们节省了相当多的时间,它生成的不是一个文件,而是两个文件。
要查看其实际效果,最后一步是将以下脚本添加到package.json
.
"scripts": {
..., // rest of scripts
// add this at the end
"generate": "plop"
},
我们终于准备好了,坐下来,放松一下,欣赏这场演出。在终端上输入
yarn generate
# or
npm run generate
现在让我们创建一个Button
组件。
button
当然带有标签。
如果一切顺利
让我们检查一下组件文件夹。
import React from "react";
import { StyledButton } from "./styles";
interface ButtonProps {}
const Button = ({} : ButtonProps) => {
return <StyledButton>Button</StyledButton>;
};
export default Button;
样式文件也在那里。
import { styled } from '@stitches/react';
export const StyledButton = styled('button', {});
很酷吧?
好吧,也许这不是那么酷,但希望现在你已经意识到它的潜力。
我尽量简化了流程,只创建了两个文件,但您可以继续尝试,添加任意数量的生成器和操作。每个人/团队都各不相同,您可以根据自己的习惯/风格进行调整。您甚至可以更新现有文件,例如,如果您希望所有组件都拥有一个索引文件。您可以为钩子、页面、助手等创建生成器,一切皆有可能。
我希望你喜欢这篇指南,如果你制作了任何很酷的生成器,请告诉我@ivanms1
感谢您花时间阅读这篇文章,如果您喜欢它,请点赞支持并关注更多内容。
文章来源:https://dev.to/ivanms1/create-react-components-at-the-speed-of-light-26l4