之所以写下这篇文章,是因为自己在使用father-build建设内部组件库的过程中,遇到了一些问题且难以找到相关文档,将自己的经验总结下来希望看到这篇文章的人能避开这些坑,更加顺利地搭建好自己的前端组件库。
package.json
其中,main指定了入口文件,module对应es module的输出,types对应你的typings文件,这样在组件在被使用的时候编辑器才能识别出你的组件类型声明
.fatherrc.js 配置father build打包方式, 具体详情可以参考 umijs/father
tsconfig.json typescript的配置文件,注意只有declaration设置为true才能生成.d.ts后缀的文件
接下来我们在components目录创建第一个自己的组件,下面是一个button的例子:
样式文件可以直接使用less编写
然后在入口文件index.ts将其导出,暴漏给外部使用。
使用文档的后缀名为".mdx", 语法与markdown类似,更多详情参考 docz 的文档
我们可以执行 yarn start ,来实时查看文档的效果。
现在命令行执行 yarn build 即可对组件库进行打包了,注意我们在.fatherrc中配置了esm和cjs两种打包方式,对应会生成 es 和 lib两个目录,其中 esm对应的是 es目录,cjs对应lib目录。
正常情况下,在的es和lib目录下应该已经为我们写的ts源码自动生成了“.d.ts”后缀的类型声明文件,如果没有生成,请仔细对比.fatherrc.js和tsconfig.json这两个配置文件,另外还要注意的是,如果我们基于antd封装业务组件库的话,不要在组件库中使用css module,否则也会造成无法自动产生类型声明文件的问题。
文章未能详尽部分,可以参考这个demo的github源码地址: https://github.com/xitengfei/xui-components , 有问题欢迎批评指正。
ts 调用 js步骤
找到 js 调用 js 的方法。
增加方法调用的声明。 请参考 如何生成 .d.ts 。
示例
js 内的方法
function callJsFunc(msg) { console.log("msg from egret : " + msg)}ts 内声明
declare function callJsFunc(msg:string)//可以放在 ts 文件内(建议在顶部或者底部,中间的没试过)或者单独放到一个 .d.ts 文件中,请不要放在其他类型的文件内。msg 类型根据函数体判断。ts 内调用
callJsFunc("hello js")输出
msg from egret : hello js总结:在 js 调用 js 的基础上增加声明。其他的比如变量等,也是按上面步骤来实现。
js 调用 ts
js 调用 ts 其实就是 ts 调用 ts,由于 ts 调用 ts 可能会有同模块下的省略写法,因此只要使用不同模块下的调用来写即可。
步骤
找到非同一模块下 ts 的调用(比如 example.A.CallEgretFunc("hello"))。
完全按上面调用的方式来写 (比如上面的 example.A.CallEgretFunc("hello"))。
示例
ts 内的方法
module exampleA { export class A { public callEgretMethod(msg:string):void { console.log("method msg from js : " + msg) } public static CallEgretFunc(msg:string):void { console.log("static msg from js : " + msg) } }}非同一模块下 ts 调用
module exampleB { export function b() { //调用方法 var a:exampleA.A = new exampleA.A() a.callEgretMethod("method") //调用静态函数 exampleA.A.CallEgretFunc("function") }}js 内调用
var a = new exampleA.A()//去掉 a 的类型a.callEgretMethod("method")exampleA.A.CallEgretFunc("function")输出
method msg from js : methodstatic msg from js : function