Files
2024-09-27 01:28:38 +08:00
..
2024-09-27 01:28:38 +08:00
2024-09-27 01:28:38 +08:00
2024-09-27 01:28:38 +08:00
2024-09-27 01:28:38 +08:00
2024-09-27 01:28:38 +08:00
2024-09-27 01:28:38 +08:00
2024-09-27 01:28:38 +08:00
2024-09-27 01:28:38 +08:00
2024-09-27 01:28:38 +08:00
2024-09-27 01:28:38 +08:00
2024-09-27 01:28:38 +08:00
2024-09-27 01:28:38 +08:00
2024-09-27 01:28:38 +08:00
2024-09-27 01:28:38 +08:00
2024-09-27 01:28:38 +08:00
2024-09-27 01:28:38 +08:00
2024-09-27 01:28:38 +08:00

TsxVueClassApi

基于Vue Class ApiTypeScriptJSX,搭建的一套项目脚手架,实现了很多常用的注解,同时基于babel插件通过Ast语法树进行路由配置文件的自动生成等。

如果你喜欢JSX,那么这套脚手架你应该会十分喜欢,代码语法如下:

import "@pageLess/Home.less";
import { Component, Vue } from 'vue-property-decorator';
import HelloWorld from '@components/HelloWorld';
import { HomeLogic } from "@logic/page/Home.logic";
import { Route, RawLocation } from 'vue-router';
import { Getter } from "vuex-class";
import { BaseLayout, RouterMeta } from "@layout/base.layout";

@Component
export default class Home extends BaseLayout {

  // 抽离tsx页面组件中所有js业务逻辑到独立的类中tsx组件只负责页面
  // 因为tsx内部this指向Vue而logic.ts 中this默认指向类本身但是这里需要this指向Vue和类本身
  // 所以这里传入tsx中的this对象
  private HomeLogic: HomeLogic = new HomeLogic(this);
  // RouterMeta 是 vue-router 的路由 meta 配置信息,
  // 会被我的插件通过ast语法树提取注入到自动生成的路由配置
  // 文件中,所以名字不要随意改动,值请随便!
  private RouterMeta: RouterMeta = {
    title: '首页',
    showNav: true,
    isLogin: true
  }
  @Getter('GettersTabsContentArr') public readonly getterFoo!: Array<any>;
  public async created() {
    // utils/文件夹下中所有类中的方法,只要使用了装饰器 @GlobalMethod() 
    // 那么被装饰方法就会自动 prototype 到vue中的全局方法中
    console.log(this.$setToken())
    await this.HomeLogic.StartUp();
  }

  // 路由拦截器
  beforeRouteEnter(to: Route, from: Route, next: (to?: RawLocation | false | ((vm: Vue) => void)) => void) {
    console.log('beforeRouteEnter')
    next()
  }

  // 按钮组件
  public ClickButton(): JSX.Element {
    return (
      <el-button type="danger" onclick={async ()=>{
        await this.HomeLogic.getData()
      }}>发送请求</el-button>
    )
  }

  protected render() {
    return (
      <div class="home">
        <HelloWorld msg="向HelloWorld props传参"/>
        <input type="text" v-model={this.HomeLogic.title}/>
        <h2>{this.HomeLogic.title}</h2>
        {this.ClickButton()}
        <ul>
          {
            this.HomeLogic.List.map((v:any)=>{
              return <li>{v.name}</li>
            })
          }
        </ul>
      </div>
    )
  }
}

这个脚手架我们正在项目中使用也在支持开发和完善阶段

1安装

git clone https://gitee.com/bmycode/vue-class-api-tsx.git

npm i

npm run start

注意

Vue官方原生底层就支持JSX语法,但是官方没有关于Vue中使用JSX的文档,而且很多Vueui框架和第三方插件都没有相关语法但是这不影响我们在Vue中正常使用JSX。很多语法需要特殊注意和改造一下!!

2使用

下面说下这个脚手架的使用和注意事项。

2.1:项目结构

├── README.md
├── babel.config.js babel配置文件
├── bin   终端NewFile工具
│   ├── config 
│   │   └── index.js
│   └── tinit
├── dist  打包后的文件夹
├── gulpfile.js  gulp配置文件实现监听page自动生成路由文件
├── package.json 核心依赖配置文件
├── public       公共的资源文件
├── src          存放核心源码
│   ├── application  页面相关
│   │   ├── App.tsx 最外层顶级父组件
│   │   ├── assets  静态资源回合webpack打包进源码
│   │   ├── components 公共组件
│   │   ├── layout     TSX组件的父类
│   │   ├── logic      TSX组件中的js逻辑抽象层
│   │   │   ├── Base.logic.ts  所有TSX组件的js逻辑父类
│   │   │   └── page   对应页面的TSX组件逻辑抽象
│   │   └── page  存放TSX页面组件
│   └── core  核心JS层
│       ├── annotation 存放自己开发的装饰器
│       │   ├── Http.annotation.ts  请求装饰器
│       │   ├── Ioc.annotation.ts   IOC依赖装饰器
│       │   └── Register.annotation.ts 启动装饰器
│       ├── config    站点配置文件
│       │   ├── configure.config.ts 核心配置文件
│       │   └── route.config.ts     自动生成的路由配置文件
│       ├── dao                     axios的封装
│       ├── model                   TS存取器
│       ├── run                     项目的启动类
│       │   ├── init.run.ts   初始化Vue各种配置
│       │   └── start.run.ts  初始化Vue
│       ├── service           请求的service层封装
│       │   └── impl          请求service的具体类
│       ├── store             Vuex的配置
│       ├── types             自定义的声明文件
│       └── utils             工具函数
├── tsconfig.json             TS的配置文件
└── vue.config.js             Vue-cli3 的配合文件

2.2:使用注意事项

1 项目中的路由使用的是vue-router,同时我借鉴了Nuxt.js的思想,自己开发了路由配置文件自动生成的插件,这个插件是Vue-cli 3的插件,所以不能在Vue cli 2的项目中使用!!

插件源码已经提交npm包市场!请完整阅读下面的插件文档,路由的配置文件让插件帮我们自动生成就好了!!!

vue-cli-plugin-tsx-autorouter

2 同时借鉴PHP开发框架Laravel开发终端命令行工具,通过命令帮我们创建带有模板代码能直接运行的文件!代码放在 bin/ 文件夹中!

使用手册:

╭─bmy@MacBook-Pro /Applications/Source/TsxVueClassApi master* 
╰─$ ./bin/tinit -h
Usage: tinit [options]

Options:
  -t, --file-type <type>  文件类型: [pagelogicserviceimplless]
  -n, --file-name <name>  被创建的文件名称
  -i, --is-create <is>    是否为 -t 参数自动创建相关文件类型 (default: false)
  -v, --version           显示当前的版本
  -h, --help              display help for command

参数说明:

  • -t需要被创建的文件类型取值 pageTSX页面logicTSX页面的js抽象层service请求中间层的接口impl实现接口的类lesscss样式文件。可以多传
  • -n需要被创建的文件名
  • -i如果数值为true那么会自动创建 -t 参数所有的文件类型

使用案例:

╭─bmy@MacBook-Pro /Applications/Source/TsxVueClassApi master* 
╰─$ ./bin/tinit -t page logic -n Test
成功创建文件...

上面命令执行后会分别在src/application/page中创建创建文件Text.tsx页面组件,同时在src/application/logic/page中创建Test.logic.ts的逻辑层文件。

多试几次,请自行熟练掌握!!

3开发中功能

  • 1实时监听configure.config.ts配置文件,然后根据ApiList中的对象key名称自动在service层的类中生成对应的方法,降低手动复制的低效率!

  • 2实现对整个项目所有类的收集然后各个文件不需要多次对各种文件的引入