Closed John0King closed 2 years ago
defineComponent 定义其他 方法的时候, this 的类型是 any ,
给几段能复现的代码,我来试一试
就是简单的 san.defineComponent<T,U>()
啊, 首先 Vue可以 不用写 T,U, 自动推导, 但是 在不拆分 methods 的情况下, 几乎做不到这点, typescript 好像不允许在一个已经定义了其他东西的对象里面 在用 Map 方式定义其他的
在一个就是 U
的类型, 如果给 U类型, 他必须是个泛型, 因为 this
的类型需要 同时 T 和 U , 这样要么 在 生命周期函数里面 无法调用 U 的 成员 , 要么 自定义方法成员 的 this 是 any,
所以用 ts 最好采用 class 的方式 (最好可以有 装饰器 ), 但是 好像 typing 不支持
U看起来是有些问题。我们会重写一下 .d.ts,不过这可能需要一些时间和讨论。之前的修改,会先发个版本,ts重写完,再发个新版本
@otakustay @errorrik 我发现 san 现在有点零散, 首先是cli 默认的demo 都不是单文件, 我也不知道如何去搞 webpack , webpack 不太会, 然后就是 typescript的支持, san 在很大程度上模仿了 Vue , 并且具备 react 的某些思想 (react 不太会), 总的来说 Vue 的设计,导致了它必然在 typescript支持上比较弱, 他模糊化了用户定义的 component 的类型, 如果说 react 对 typescript 的支持得益于 tsx 本身的化, Angular 在 typescript 的支持可以说更贴近原本的js 和 typescript的关系。
$store
类字段), Angular 通过依赖注入来获得 service (用户定义的类字符)
@Component(
{
template: `<div></div>`, // 给类新增 静态字段 template
//templateUrl: `xx.html`, // 同上但是 require("xx.html") , 这个不重要,也不确定装饰器的非metadata能不能这么干(路径问题)
}) @Store() // 由store提供,代替 store.connecte export default MyComponent extends Component{ @watch('user.name') onUserNameChange(){ .... }
@storeAction("user.changeUserName")
changeUserName(name:string){ return name }// 被转化成 store的操作,简单的包装一下
}
CLI 默认化, 现在CLI 工具太不规范了, 采用直接的 webpack 而且很多东西默认没有引入进来, 最少的保障,应该是集成了 scss,less,typescript, san单文件功能
用 CLI 创建项目时,CSS 预处理器提供了 Less、Sass、Stylus 这 3 种选择,用户选择任一种后都能直接使用,不需要额外的配置。 CLI 对 San 单文件组件的支持也是开箱即用的,直接写 .san 文件就行,用户不需要另外配置。 TypeScript 的话,倒是确实需要用户自己在 san.config.js 里配置下 ts-loader。
@Lohoyo 但是CLI太零散是个事实啊, 单文件很好,但是默认生成里面没有, 我现在主要是想用 单文件, 编译成 UMD 格式的 单个 文件(我想在 IE8 里面的aspx 里面用), 我有点想自己配webpack , 但是 webpack 入门有点难, 有点怀念 Vue cli , 默认打包成 UMD 格式, 可以用单文件维护组件, js 在页面上调用
@Lohoyo 但是CLI太零散是个事实啊, 单文件很好,但是默认生成里面没有, 我现在主要是想用 单文件, 编译成 UMD 格式的 单个 文件(我想在 IE8 里面的aspx 里面用), 我有点想自己配webpack , 但是 webpack 入门有点难, 有点怀念 Vue cli , 默认打包成 UMD 格式, 可以用单文件维护组件, js 在页面上调用
@John0King 试试参考下这个 san-loader example
这个可以打包成 UMD 么? 我想把一堆组件用 index.ts 全部导出来, 然后用 <script src="path/MyUmdName.js">
应用, 然后用 MyUmdName.ComponenentName
来访问我的组件 , UMD的好处就是同步异步都支持
@otakustay @zhmushan @errorrik @Lohoyo
//index.d.ts
export = San;
使用 typescript 的默认模式(无npm, webpack), 这句是不正确的,因为这样 无法导出 San命名空间中的任何东西, 导致无法访问任何 San.Component<T>
的定义
interface MyComponentMethods {
showLayer(this: San.SanComponent<unknown> & ProductAreaMethods);
inputFocus(this: San.SanComponent<unknown> & ProductAreaMethods,e: MouseEvent);
hideLayer(this: San.SanComponent<unknown> & ProductAreaMethods);
bodyClickAction: (e: JQuery.Event<HTMLElement, null>) => any;
flylayer: (San.SanComponent<unknown> & ProductAreaLayerMethods) | null;
queryAction: () => any;
onChange(this: San.SanComponent<unknown> & ProductAreaMethods, item: any);
onKeyup(this: San.SanComponent<unknown> & ProductAreaMethods, e: KeyboardEvent)
onBlur(this: San.SanComponent<unknown> & ProductAreaMethods, e: Event)
}
上面这段, San.*
全都报错, 除非我再某个地方 使用 require/import , 但是,这将导致我的文件生成 export 语句, 或者 export.__EsModule = true 的代码
建议的修改:
declare global
,改为 直接 declare const san : SanStaticGlobal
考虑到 cli 使用 import 导入
考虑 增加 declear module "san" { export = San }
能给个能用的 san cli + ts 的 demo 么?
能给个能用的 san cli + ts 的 demo 么?
里面没有ts 😂
获取 Outlook for Androidhttps://aka.ms/ghei36
From: Huyue @.> Sent: Monday, September 6, 2021 11:04:22 AM To: baidu/san @.> Cc: john @.>; Mention @.> Subject: Re: [baidu/san] type.d.ts 无法使用 typescript编写代码! (#635)
能给个能用的 san cli + ts 的 demo 么?
https://github.com/Lohoyo/san-cli-ts-demo
— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHubhttps://github.com/baidu/san/issues/635#issuecomment-913302168, or unsubscribehttps://github.com/notifications/unsubscribe-auth/ADIB32VV22REFDY455TU6CDUAQVTNANCNFSM5AXWZGTA. Triage notifications on the go with GitHub Mobile for iOShttps://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675 or Androidhttps://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub.
@errorrik
安装了最新的 san cli , 并且永 san init
设置了一个 typescript + store 的项目
san server
san-cli@4.1.0/san-cli-serve@2.0.0
i Starting development server... 上午9:59:33
* Serve █████████████████████████ setup (3%)
watch run
Error: not found: php
at getNotFoundError (E:\zyui\zyui\node_modules\hulk-mock-server\node_modules\which\which.js:10:17)
at Function.whichSync [as sync] (E:\zyui\zyui\node_modules\hulk-mock-server\node_modules\which\which.js:121:9)
at serveSmarty (E:\zyui\zyui\node_modules\hulk-mock-server\serve\smarty.js:42:21)
at processorFactory (E:\zyui\zyui\node_modules\hulk-mock-server\index.js:162:37)
at E:\zyui\zyui\node_modules\hulk-mock-server\index.js:55:29
at Array.map (<anonymous>)
at middleware (E:\zyui\zyui\node_modules\hulk-mock-server\index.js:54:10)
at E:\zyui\zyui\san.config.js:82:65
at C:\Users\ABlue\AppData\Local\Yarn\Data\global\node_modules\san-cli-service\Service.js:578:92
at Array.forEach (<anonymous>) {
code: 'ENOENT'
san build
log
san-cli@4.1.0/san-cli-build@2.0.0
i Building for production... 上午10:02:37
× Build
Compiled with some errors in 5.45s
ERROR [SanFriendlyErrorsPlugin]Failed to compile with 4 errors. 上午10:02:43
ERROR Loading PostCSS "postcss-import" plugin failed: Cannot find module 'postcss-import' 上午10:02:43
Require stack:
- C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\postcss-loader\dist\utils.js
- C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\postcss-loader\dist\index.js
- C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\postcss-loader\dist\cjs.js
- C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\webpack\lib\ProgressPlugin.js
- C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\webpack\lib\index.js
- C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\san-cli-webpack\build.js
- C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\san-cli-build\run.js
- C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\san-cli-build\index.js
- C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\san-cli\index.js
(@E:\zyui\zyui\src\pages\index\containers\app.less)
at Object.emitError (C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\webpack\lib\NormalModule.js:592:6)
at getPostcssOptions (C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\postcss-loader\dist\utils.js:224:19)
at Object.loader (C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\postcss-loader\dist\index.js:65:42)
ERROR Loading PostCSS "postcss-import" plugin failed: Cannot find module 'postcss-import' 上午10:02:43
Require stack:
- C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\postcss-loader\dist\utils.js
- C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\postcss-loader\dist\index.js
- C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\postcss-loader\dist\cjs.js
- C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\webpack\lib\ProgressPlugin.js
- C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\webpack\lib\index.js
- C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\san-cli-webpack\build.js
- C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\san-cli-build\run.js
- C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\san-cli-build\index.js
- C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\san-cli\index.js
(@E:\zyui\zyui\src\components\demo-comment\style\index.css)
at Object.emitError (C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\webpack\lib\NormalModule.js:592:6)
at getPostcssOptions (C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\postcss-loader\dist\utils.js:224:19)
at Object.loader (C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\postcss-loader\dist\index.js:65:42)
ERROR Loading PostCSS "postcss-import" plugin failed: Cannot find module 'postcss-import' 上午10:02:43
Require stack:
- C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\postcss-loader\dist\utils.js
- C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\postcss-loader\dist\index.js
- C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\postcss-loader\dist\cjs.js
- C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\webpack\lib\ProgressPlugin.js
- C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\webpack\lib\index.js
- C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\san-cli-webpack\build.js
- C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\san-cli-build\run.js
- C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\san-cli-build\index.js
- C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\san-cli\index.js
(@E:\zyui\zyui\src\components\demo-publisher\style\index.css)
at Object.emitError (C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\webpack\lib\NormalModule.js:592:6)
at getPostcssOptions (C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\postcss-loader\dist\utils.js:224:19)
at Object.loader (C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\postcss-loader\dist\index.js:65:42)
ERROR Loading PostCSS "postcss-import" plugin failed: Cannot find module 'postcss-import' 上午10:02:43
Require stack:
- C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\postcss-loader\dist\utils.js
- C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\postcss-loader\dist\index.js
- C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\postcss-loader\dist\cjs.js
- C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\webpack\lib\ProgressPlugin.js
- C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\webpack\lib\index.js
- C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\san-cli-webpack\build.js
- C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\san-cli-build\run.js
- C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\san-cli-build\index.js
- C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\san-cli\index.js
(@E:\zyui\zyui\src\pages\demo-store\containers\app.css)
at Object.emitError (C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\webpack\lib\NormalModule.js:592:6)
at getPostcssOptions (C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\postcss-loader\dist\utils.js:224:19)
at Object.loader (C:\User\<myUser>AppData\Local\Yarn\Data\global\node_modules\postcss-loader\dist\index.js:65:42)
* Build █████████████████████████ done (99%) plugins
MultiCompiler
使用 yarn build , 现在编译成功了, 但是编译后没有html, 另外 yarn start 还是不成功, 需要php ?
使用 yarn build , 现在编译成功了, 但是编译后没有html, 另外 yarn start 还是不成功, 需要php ?
在windows上用san-cli找不到php的问题可以看看这个:https://github.com/ecomfe/san-cli/issues/216 另外,创建项目时模板选html应该也可以避免这个问题,模板选smarty才会用到php。
smarty 是 php的一个模板引擎么? 如果是这样,他不应该是推荐的, 而且选项上应该写 PHP模板(Smarty)
smarty 是 php的一个模板引擎么? 如果是这样,他不应该是推荐的, 而且选项上应该写
PHP模板(Smarty)
对,smarty是php的一个模板引擎。 我觉得你说的有道理,我给san-cli的项目模板提了一个pr:https://github.com/wanwu/san-project/pull/20
3.11 已经更新了 ts 和 example,这个 issue 先关了。有问题开新的吧
具体表现位,
defineComponent
的时候, 无法编写自定义的方法, 如果使用defineComponent<any,any>
则 在所有的方法中, this 变成了any
, 我们需求可以推断的定义文件