在做有些项目的时候有时候会遇到要重复创建内容大概相同的文件,但是命名和文件夹存放不一样的业务。比如说组件参考文档框架的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.ts
、Button.component.tsx
;如果是使用拷贝文件夹然后再修改,一个文件夹最少要花费三五分钟,现在大概不要5秒;这样就可以在这两个文件在愉快的写文档了。