1.0.10 • Published 11 months ago

@suey/surly v1.0.10

Weekly downloads
-
License
ISC
Repository
-
Last release
11 months ago

安装

采用vite创建项目, 使用 npm:

$ npm init
$ npm install vite --save-dev
$ tsc --init
$ npm install @suey/surly --save

使用 pnpm

$ pnpm init
$ pnpm install vite --save-dev
$ tsc --init
$ pnpm install @suey/surly --save

如果你还想使用一部分基础函数, 你可以

$ npm install @suey/packages --save
$ pnpm install @suey/packages --save
// vite.config.ts
// 导入插件, 以解析 jsx 语法和提供 框架支持
import { defineConfig } from 'vite';
import { surlyTsx } from '@suey/surly/compiler';

export default defineConfig({
  plugins: [surlyTsx()]
});
// main.tsx
import { Surly, Inject, Component, Created, Mount, Mounted, Destroy, Destroyed, Render } from '@suey/surly';
import { setupApp } from '@suey/surly';
import { printError, printInfo, printWarn } from '@suey/surly/printer';

/** 你的组件可以不由Component修饰, 但得保证含有 render 函数, 或者是由 @Render 装饰器修饰的函数 */
class HelloWrold {
  render = () => (<div>Hello World !!</div>)
}

@Surly('app')
class App {
  /** 使用 Inject可以实现自动注入, 就比如你实现了一个向全局提供服务的类, 你只需要使用 Inject 修饰, 并给出服务类的类型, 那么会自动将该服务类注入到这里 */
  @Inject c: HelloWrold;

  /** 这是函数的生命周期 */
  @Created create() {
    printInfo(`当组件被初始化的时候会自动调用`);
  }

  /** 渲染函数 */
  render() {
    return (
      <div><HelloWrold /></div>
    )
  }
}

/** 创建应用程序 */
setupApp(App);

/**
 * 当然如果想要手动卸载, 又或者使用插件以丰富可以接受其返回值
 * const app = setupApp(App);
 *
 * app.destory();
 */
/**
 * 1. css in js
 * 2. 自动注入全局变量, 更加系统化, @Inject 函数, @Provider 函数配合, 组件交流, 换肤更加容易
 * 3. 综合 1 和 2 两点, css in js, css 变量可以描述为一个js变量进行处理, 样式更换更加平滑
 * 4. 借鉴了其他框架, 采用了组件化处理, 生命周期函数以及响应式系统, 使用者只需要关注数据, 由数据驱动视图
 *    生命周期由装饰器修饰提供, 当某个函数需要被作为生命周期函数处理时, 只需要加上生命周期处理函数
 * 5. 强大的注入系统, 大多数处境, 你的组件需要获得信息的时候, 只需要使用装饰器便可以获得, 例如某个函数需要获取 props 时, 只需要加上参数装饰器 @Props 修饰即可
 * 6. 典型的控制反转机制, 你无需自行处理组件的渲染过程, 只需要在意代码逻辑, 在意组件的组织过程即可
 * 7. 多 render 渲染函数机制, 当你声明一个 render 函数返回 node 节点的时候, 可以为 render 函数命名, 采用 @Render 装饰器
 *    例如 @Render('pc') render() {}, @Render('android') render() {}
 *    这将为多平台处理创造出解决方案。当你使用 setup 建立应用程序的时候, 配置平台参数, 即可动态的返回创建的node节点
 * 8. 存储系统的提供, 在其他框架中, 存储系统将作为一个对象, 例如 Vuex 的处理方案, 需要引入一个 useStore 函数, 创建对应的对象
 *    但利用注入系统, 你只需要引入这个存储系统类即可, 并且作为类型注释放到注释对象中
 *    例如 @Inject('store') store: Store; Store为你的存储类, 这时将会去寻找一个名为 store 的 Store类型的对象
 * 9. 采用 tsx 的写法, 相比 Vue 更加灵活.虽然 Vue 也可以采用 tsx 的写法, 但是并没有 css in js 的加持, 并没有那么丝滑。
 * 10.创建 hooks 之后的使用方式更加简单, 推荐 hooks 也写成装饰器的形式, 这样可以自动的加装到组件对象中。当然写成函数式的方式也没有问题。
 *
 *
 * 11.router处理, 目前还没有想好如何与结合router创建一个 spa 页面
 * 12.SSR, 目前不会 SSR, 所以根本没有什么入手点去创建一个 SSR 应用程序
 *
 * 13.样式隔离系统, 默认采取了样式隔离, 避免污染全局的 CSS, 当用户需要创建全局的样式时, 建议创建 css, scss, less 文件进行处理
 * 14.采用Web Worker实现性能优化,并提供Worker的使用Api
 *
 * 15.还需要避免虚拟Dom进行对比所产生的性能消耗,如何在最大程度上减少 diff 算法带来的性能损失
 * 16.引入了Web Worker之后,将会多出一个多线程的概念,如何解决多线程带来的 Api 书写和语义简写
 *
 * 17.如果采用此框架进行编写项目,那么就不能采用CDN的模式进行书写,因为默认情况下浏览器不支持TS,本框架需要使用到TS的类型注释以达到控制反转的效果
 * 18.强大的介入系统,本框架会预留许多的空置位,让用户编写代码时,如果想要在框架运行的时候介入其中,做某些操作,本框架会做最大程度的预留空间
 *
 * 19.需要建立 cli,创建本框架的脚手架,负责帮忙建立项目文件.
 */

/** 接下来列举一个简单的 hooks 装饰器, 我并未实现具体的函数修改过程 */

/**
 * 节流函数装饰器, 直接装饰使用
 * @param target 装饰器对象
 * @param propertyKey 装饰器函数的key
 * @param descriptor 装饰器函数的描述
 */
function Throttle<T>(target: object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<T>): void;

/**
 * 创建一个节流函数装饰器
 * @param {number} time 节流函数的时间参数
 * @returns {MethodDecorator} 返回一个方法装饰
 */
function Throttle(time?: number): MethodDecorator;

/**
 * 创建一个节流函数
 * @param {() => void} fn 执行函数
 * @param {number} time 节流函数的时间参数
 * @returns 返回一个节流函数
 */
function Throttle(fn: () => void, time?: number): Function;

function Throttle<T>(target?: object | (() => void) | number, propertyKey?: string | symbol | number, descriptor?: TypedPropertyDescriptor<T>): MethodDecorator | Function | void {
  // 装饰器
  if (target && propertyKey && descriptor) {

    return;
  }

  // 节流函数装饰器
  if (!target || typeof target === 'number') {
    target = target ?? 50;

    return (t, p, d) => {
      // 修改函数
    }
  }

  // 正常调用的节流函数, 书写并返回

  return () => void 0;
}


const resize = Throttlr((e: UIEvent) => {
  console.log('页面大小被调整了');
});

class Target {
  @Created created() {
    window.addEventListener('resize', (e) => this.resize(e));

    // window.addEventListener('resize', e => resize(e));
  }

  // @Throttle resize(e: UIEvent) {
  //   console.log('页面大小被调整了');
  // }

  // @Throttle(100) resize(e: UIEvent) {
  //   console.log('页面大小被调整了');
  // }
}
1.0.10

11 months ago

1.0.9

12 months ago

1.0.8

12 months ago

1.0.7

1 year ago

1.0.6

1 year ago

1.0.5

1 year ago

1.0.4

1 year ago

1.0.3

1 year ago

1.0.2

1 year ago

1.0.1

1 year ago

1.0.0

1 year ago