## TsxVueClassApi 基于`Vue Class Api`,`TypeScript`,`JSX`,搭建的一套项目脚手架,实现了很多常用的注解,同时基于`babel`插件通过`Ast`语法树进行路由配置文件的自动生成等。 如果你喜欢`JSX`,那么这套脚手架你应该会十分喜欢,代码语法如下: ```tsx 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; 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 ( { await this.HomeLogic.getData() }}>发送请求 ) } protected render() { return (

{this.HomeLogic.title}

{this.ClickButton()}
    { this.HomeLogic.List.map((v:any)=>{ return
  • {v.name}
  • }) }
) } } ``` **这个脚手架我们正在项目中使用也在支持开发和完善阶段** ## 1:安装 > git clone https://gitee.com/bmycode/vue-class-api-tsx.git > npm i > npm run start **注意** `Vue`官方原生底层就支持`JSX`语法,但是官方没有关于`Vue`中使用`JSX`的文档,而且很多`Vue`ui框架和第三方插件都没有相关语法,但是这不影响我们在`Vue`中正常使用`JSX`。很多语法需要特殊注意和改造一下!! ## 2:使用 下面说下这个脚手架的使用和注意事项。 ### 2.1:项目结构 ```txt ├── 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](https://www.npmjs.com/package/vue-cli-plugin-tsx-autorouter) **2:** 同时借鉴`PHP`开发框架`Laravel`开发终端命令行工具,通过命令帮我们创建带有模板代码能直接运行的文件!代码放在 `bin/` 文件夹中! 使用手册: ```bash ╭─bmy@MacBook-Pro /Applications/Source/TsxVueClassApi ‹master*› ╰─$ ./bin/tinit -h Usage: tinit [options] Options: -t, --file-type 文件类型: [page,logic,service,impl,less] -n, --file-name 被创建的文件名称 -i, --is-create 是否为 -t 参数自动创建相关文件类型 (default: false) -v, --version 显示当前的版本 -h, --help display help for command ``` 参数说明: - -t:需要被创建的文件类型,取值 page(TSX页面),logic(TSX页面的js抽象层),service(请求中间层的接口),impl(实现接口的类),less(css样式文件)。可以多传! - -n:需要被创建的文件名 - -i:如果数值为true,那么会自动创建 -t 参数所有的文件类型 使用案例: ```bash ╭─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:实现对整个项目所有类的收集,然后各个文件不需要多次对各种文件的引入!