如何使用Node编写开发小工具

在做有些项目的时候有时候会遇到要重复创建内容大概相同的文件,但是命名和文件夹存放不一样的业务。比如说组件参考文档框架的Storybook的编写,就是需要大量的拷贝相同的文件代码,其目录大概如下

|--|
| src
|  |--Buttom
|  |    |--Button.component.tsx
|  |    |--Button.stories.ts
|  |--Input
|  |    |--Input.component.tsx
|  |    |--Input.stories.ts
|  |--.....很多文件夹
|  |......很多文件

上面文件目录里面的内容都相差不大,就是文件名和组件名不一样, 那么我们可以使用Node.js创建文件夹文件减少复制粘贴的繁琐工作,其代码如下:

/* 
 * initFile.js
 * 使用js生产新的Story文件
 * 执行 npm run init [your file name] [project]
 * npm run init button mui
 */
import fs from "fs";
const args = process.argv.slice(2);

const getProjectType = () => {
  let type = false;
  if (args?.length) type = args.some((item) => item?.toLowerCase() === "mui");
  return type;
};

const firstCharsToUpperCase = () => {
  if (args?.length) {
    const name = args?.[0] ?? "";
    return `${name.toLowerCase().slice(0, 1).toUpperCase()}${name.slice(1)}`;
  } else {
    return "Test";
  }
};

const isMui = getProjectType();
const fileName = firstCharsToUpperCase();

const storyContent = `
  import type { Meta, StoryObj } from '@storybook/react'

  import { ${fileName} } from './${fileName}.component'

  const meta = {
    title: '${isMui ? "Mui" : "Antd"}/${fileName}',
    component: ${fileName},
    parameters: {
      layout: 'centered',
    },
    tags: ['autodocs'],
    argTypes: {},
  } satisfies Meta<typeof ${fileName}>

  export default meta
  type Story = StoryObj<typeof meta>

  export const Primary: Story = {
    args: {},
  }
`;

const componentContent = `
  import { ${fileName} as Mui${fileName} } from '@Xcloud/${
  isMui ? "mui" : "antd"
}';
  import type { ${fileName}Props as Mui${fileName}Props } from '@ocloud/${
  isMui ? "mui" : "antd"
}';
  import type { ReactNode } from "react";

  export interface ${fileName}Props extends Mui${fileName}Props {
    children?: ReactNode;
  }

  export const ${fileName} = ({ children, ...rest }: ${fileName}Props) => (
    <Mui${fileName} {...rest}>{children}</Mui${fileName}>
  );
`;

((storyContent, componentContent) => {
  const storyName = `${firstCharsToUpperCase()}.stories.ts`;
  const componentName = `${firstCharsToUpperCase()}.component.tsx`;
  const filePath = isMui
    ? `./src/stories/Mui/${fileName}`
    : `./src/stories/Antd/${fileName}`;
  fs.mkdir(filePath, { recursive: true }, (err) => {
    if (err) return callback(err);
    fs.writeFile(`${filePath}/${storyName}`, storyContent, (error) => {
      if (error) return console.error(error);
      console.log("Create story success!");
    });
    fs.writeFile(`${filePath}/${componentName}`, componentContent, (error) => {
      if (error) return console.error(error);
      console.log("Create component success!");
    });
  });
})(storyContent, componentContent);

编写好上面的Node脚本之后,就可以执行了,在项目的pageage.json中的scripts属性中增加如下配置

  "scripts": {
    "init": "node initFile",
    "dev": "storybook dev -p 6006",
  },

然后在编辑器控制台或者CMD窗口中执行命令npm run init button mui,就会在src/Mui文件下生成文件夹Button和两个文件Button.stories.tsButton.component.tsx;如果是使用拷贝文件夹然后再修改,一个文件夹最少要花费三五分钟,现在大概不要5秒;这样就可以在这两个文件在愉快的写文档了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值