一个页面可能包含固定的几个文件,如果一个个创建就不太方便,利用node通过命令的方式快捷创建出你的页面

├─index
├─index.config.ts
├─index.scss
├─index.tsx
├─interface.d.ts
├─model.ts
├─service.ts

效果

count2.gif

获取用户输入的内容

  1. const fs = require('fs');
  2. const dirName = process.argv[2];
  3. // 转换成大写 test => Test ; test-page => TestPage
  4. const capPirName = dirName.split('-').map(str=>str.substring(0, 1).toUpperCase() + str.substring(1)).join('')
  5. if (!dirName) {
  6. console.error('示例:npm run tep 名称');
  7. process.exit(0);
  8. }

创建六件套文件

1. 创建config模板

变量通过用户输入获取

  1. const config = `
  2. export default {
  3. navigationBarTitleText: "${dirName}"
  4. }
  5. `

2. 创建scss模板

  1. const scss = `
  2. ${dirName}-wrap {
  3. width: 100%;
  4. min-height: 100vh;
  5. }
  6. `

3. 创建tsx模板

  1. const tsx = `
  2. import React, { Component, useState, useEffect, FC } from 'react'
  3. import Taro from "@tarojs/taro";
  4. import { View } from '@tarojs/components'
  5. import { ${capPirName}Props } from './interface';
  6. import { get${capPirName}List } from './service';
  7. import "./index.scss";
  8. const ${capPirName}: FC<${capPirName}Props> = (props) => {
  9. return (
  10. <View className="${dirName}-wrap" >
  11. ${dirName}
  12. </View>
  13. )
  14. }
  15. export default ${capPirName}
  16. `

4. 创建interface模板

  1. const interface = `
  2. export interface ${capPirName}Props {
  3. }
  4. `

5. 创建model模板

  1. const model = `
  2. import { Effect } from "dva";
  3. import { Reducer } from "redux";
  4. export interface ${capPirName}ModelState {
  5. }
  6. export interface ${capPirName}ModelType {
  7. namespace: "${dirName}";
  8. state: ${capPirName}ModelState;
  9. effects: {
  10. fetch${capPirName}: Effect;
  11. };
  12. reducers: {
  13. save${capPirName}: Reducer<${capPirName}ModelState>;
  14. };
  15. }
  16. const initState: ${capPirName}ModelState = {
  17. };
  18. const ${capPirName}Model: ${capPirName}ModelType = {
  19. namespace: "${dirName}",
  20. state: initState,
  21. effects: {
  22. *fetch${capPirName}(_, { call, put }) {
  23. },
  24. },
  25. reducers: {
  26. save${capPirName}(state = initState, action) {
  27. return { ...state, ...action.payload }
  28. }
  29. }
  30. };
  31. export default ${capPirName}Model;
  32. `

6. 创建service模板

  1. const service = `
  2. import fly from "@/utils/request";
  3. export function get${capPirName}List() {
  4. return fly.request({
  5. url: "/api/${dirName}",
  6. method: "get"
  7. });
  8. }
  9. `

补充

自动将创建的文件引入到路由和redux中

  1. // 敬请期待...

使用 fs 写入文件

  1. fs.mkdirSync(`./src/pages/${dirName}`);
  2. process.chdir(`./src/pages/${dirName}`);
  3. fs.writeFileSync('model.ts', model); // 1
  4. fs.writeFileSync(`index.tsx`, tsx); // 2
  5. fs.writeFileSync('service.ts', service); // 3
  6. fs.writeFileSync(`index.scss`, scss); // 4
  7. fs.writeFileSync('index.config.ts', config);// 5
  8. fs.writeFileSync(`interface.d.ts`, interface); // 6
  9. process.exit(0);

完整的代码

使用node执行即可 node xxx.js
我把这个文件选择放在 scripts/template.js

  1. const fs = require('fs');
  2. const dirName = process.argv[2];
  3. // 转换成大写 test => Test ; test-page => TestPage
  4. const capPirName = dirName.split('-').map(str => str.substring(0, 1).toUpperCase() + str.substring(1)).join('')
  5. if (!dirName) {
  6. console.error('示例:npm run tep 名称');
  7. process.exit(0);
  8. }
  9. const config = `
  10. export default {
  11. navigationBarTitleText: "${dirName}"
  12. }
  13. `
  14. const scss = `
  15. ${dirName}-wrap {
  16. width: 100%;
  17. min-height: 100vh;
  18. }
  19. `
  20. const tsx = `
  21. import React, { Component, useState, useEffect, FC } from 'react'
  22. import Taro from "@tarojs/taro";
  23. import { View } from '@tarojs/components'
  24. import { ${capPirName}Props } from './interface';
  25. import { get${capPirName}List } from './service';
  26. import "./index.scss";
  27. const ${capPirName}: FC<${capPirName}Props> = (props) => {
  28. return (
  29. <View className="${dirName}-wrap" >
  30. ${dirName}
  31. </View>
  32. )
  33. }
  34. export default ${capPirName}
  35. `
  36. const interface = `
  37. export interface ${capPirName}Props {
  38. }
  39. `
  40. const model = `
  41. import { Effect } from "dva";
  42. import { Reducer } from "redux";
  43. export interface ${capPirName}ModelState {
  44. }
  45. export interface ${capPirName}ModelType {
  46. namespace: "${dirName}";
  47. state: ${capPirName}ModelState;
  48. effects: {
  49. fetch${capPirName}: Effect;
  50. };
  51. reducers: {
  52. save${capPirName}: Reducer<${capPirName}ModelState>;
  53. };
  54. }
  55. const initState: ${capPirName}ModelState = {
  56. };
  57. const ${capPirName}Model: ${capPirName}ModelType = {
  58. namespace: "${dirName}",
  59. state: initState,
  60. effects: {
  61. *fetch${capPirName}(_, { call, put }) {
  62. },
  63. },
  64. reducers: {
  65. save${capPirName}(state = initState, action) {
  66. return { ...state, ...action.payload }
  67. }
  68. }
  69. };
  70. export default ${capPirName}Model;
  71. `
  72. const service = `
  73. import fly from "@/utils/request";
  74. export function get${capPirName}List() {
  75. return fly.request({
  76. url: "/api/${dirName}",
  77. method: "get"
  78. });
  79. }
  80. `
  81. fs.mkdirSync(`./src/pages/${dirName}`);
  82. process.chdir(`./src/pages/${dirName}`);
  83. fs.writeFileSync('model.ts', model); // 1
  84. fs.writeFileSync(`index.tsx`, tsx); // 2
  85. fs.writeFileSync('service.ts', service); // 3
  86. fs.writeFileSync(`index.scss`, scss); // 4
  87. fs.writeFileSync('index.config.ts', config);// 5
  88. fs.writeFileSync(`interface.d.ts`, interface); // 6
  89. process.exit(0);

最后将引入到package.json中

找到scripts的对象, 加

  1. "scripts": {
  2. "tep":"node scripts/template.js", // 引入你的文件路径~
  3. // ... 省略一大堆
  4. "dev:jd": "npm run build:jd -- --watch",
  5. "dev:quickapp": "npm run build:quickapp -- --watch"
  6. },

开始使用

自动引入实现中…

  • 记得手动将页面引入 [ app.config.ts ] 中
    1. // xxx为你的页面名称
    2. 使用npm
    3. npm run tep xxx
    4. 使用yarn
    5. npm tep xxx