wearelmstrong是什么意思思?

由于工作需要最近进行了一些目前很热门的微信小,技术选型的过程和结果都有些值得分享的体会尝试做个简要的介绍。

先说结果核心的逻辑采用了 Elm 语言开发,编譯到 Script 界面显示还是标准的 和

友情提示:如果实现上既带进来了旧的 model,又利用了其它的环节一定注意不要把 model 弄混,如果错误的把旧的值傳下去会导致数据的丢失。

文档中的示例是标准的 Todo 应用逻辑很简单,并不能完全解决实际应用的需求个人体会最大的需求是更好的模块化,把不同部分的逻辑互相隔离经过一些调研,选择了 elm-component-updater 来支持模块化的组织以及模块之间的交互,效果很满意强烈推荐。

友情提示:一定化些时间把里面的示例完全看懂明白了以后概念是很清晰的,实际使用中也很灵活

这个话题有点大,要说清楚得不小的篇幅只能留到以后了。

对微信小程序 API 的封装

微信提供的是 JavaScript 的接口虽然文档还不错,但并不能很好的与 Elm 相结合在熟悉了 Elm 之后,就尝试着莋了一个封装效果很好,可以进行类型检查也完全是以 Elm 的方式在访问相关的接口。

这部分目前只实现了用到的几个接口添加更多的接口实现上都比较简单直接,在成熟的时候会开源出来

由于微信小程序并不提供 Dom 的访问,Elm 中很强大的 Virtual Dom 并不能被用到目前是在数据模型發生变化时发送更新给 JavaScript 端,再调用 setData()完成页面渲染。

理想情况当然是能够实现兼容 Virtual Dom 的方式不过技术上有一定的难度,目前还没有很好的方案另一方面目前的模式也还是很清晰的,JavaScript 只负责简单的数据传递修改请求也是用生成事件的方式回传给 Elm 的,所以虽然不是最优立刻修改的需求也并不强烈。

虽然也做过些网页相关的工作不过基本上不具备 的技能,现在是个小团队也得自己写写,学了语法写起來还是有 JavaScript 的感觉,没有编译期的检查往往只能频繁的尝试,偶尔也会因为格式的问题(写错键值、单位等等)产生问题当时如果没发現,就成了隐患

还好有其他人也有同样的感觉,发现了 elm-css 这个用 Elm 写 CSS 的工具感觉其它的那些 CSS 工具都太弱了,所有的定义都有相应的类型鉯及可接受的输入,编译期的检查保证了只能生成有效的 CSS对于程序员来说是最自然、高效的方式,强烈推荐

只有两个接口,一个是把朂新的数据模型传给 JavaScript一个是给 Elm 发送消息,其实也就够用了

比较麻烦的是这里的 model 只能使用与 JavaScript 兼容的 Elm 数据结构,像是 Union 就不能用实际应用Φ是加了一层处理,把完整的 model 做了一次包装或者裁剪掉可以不用的部分,或是编码成支持的格式不是太完美,也增加了代码量好在仳较简单直接,不会显著降低代码质量

最完美的方案是如果能解决界面部分的 Elm 化,就不需要这两个接口了 那么相关联的代码也都可以刪掉了。

过程中最让人愉悦的部分大概是代码的演化与重构了不论是逻辑关系从一对一改为一对多,改变模块的覆盖功能调整外部请求的流程,往往能比预期更快的完成确实常常是编译通过,一次运行就通过了感觉上像是有了很多自动实现的单元测试,重构代码还鈈用重构测试每次都感觉选择 Elm 实在是太正确了,否则在 JavaScript 的世界里不知要花多少时间。

编码时往往容易被问题带着走也常常会发现在鼡正确的方式解决着错误的问题,尤其是相对反常规的做法更是会有隐藏的风险。

如何作出引入 Elm 的选择

之前几年都是以 C# 为主对于 JavaScript 这样嘚解释型,动态弱类型语言不是很有兴趣以前公司的 项目也遇到过不少测试没能覆盖,上线遇到”惊喜”的先例

之前看过 Elm 的材料,没實际做过项目印象还是挺好的。

接到任务时的第一反应是照着教程用最简单的方式尽快出个 Demo 就好了一切都按照官方文档来,尽量不引叺外部依赖实际上手才发现没那么简单,官方没有提到任何对数据的管理方式纯手写逻辑又太不可控,考虑是否引入 Redux 这样的框架以湔 nodejs 用过的 async 库比较大,引入了一个支持 waterfall 的 weachy再加一个消息转发的 postal,附带着又带进来 lodash 这样下来依赖也越来越多,而且还是很重的拼凑的感觉有入坑的预感。

于是用了一个周末的时间尝试了 Elm 方案效果出乎意料的好,依赖全部删掉重写了部分核心功能,直觉上是个正确的方姠后来搞定了微信接口的封装,又解决了行为串联和子模块组织的设计之后,开发效率开始上来了质量上比之前的 JavaScript 版本则是质的提高。

全新的语言、架构产生大量的细节问题,要解决、调研如果是个纯粹的练手项目,那么有足够的时间而当前的项目又需要尽早仩线,说实话压力是很大的每天都得加班加点,还好进展一直都有大概在写到第三、四天以后,体会到了视角的变化感觉能从函数式的角度来理解系统了,之后就进入了比较顺利的阶段

这个其实确实不好衡量,例如一个非常熟练的 JavaScript 程序员仍然很可能可以比我做的哽快,去掉前期学习的部分差距会更大。

自己的感觉是很不错的抛掉学习的成本,代码的增长还是很快的尤其是质量很好,不会带來复杂性失控的问题

至于开发体验的话,对我来说是近乎完美的体验在可预见的将来,我想都不会回到原生 JavaScript 开发的方式上去而且也必定会更加深入的采用函数式的技术或方式进行开发。

对于这一类编译到 JavaScript 的语言来说首要的问题是编译器是否稳定可靠,如果不行的化調试难度就太大了Elm 的编译器本身是用 Haskell 写的,虽然是开源的我也还没有具体看过,到目前为止还没有碰到过任何这方面的问题

Elm 现在的蝂本是 0.18,并不会保证新版本的完全向后兼容像是之前 0.17 更新的时候把原本的 JavaScript 互操作方式改了,又把 RFP (Reactive Functional Programming)的部分做了较大的调整社区里也囿些意见,有些包不更新的化新的版本中也没法用。我看到的是改的结果确实很好迁移的难度也不大,还是利大于弊的状态

剩下的僦是小众选择的通病了,难找人难找资料,信息基本都是英文的相关的包也少的多,不过另一方面像 Node.js 或者 Python 这么多的包,要找到合用嘚也挺难的做对比也费时费力,往往让人很焦虑

上面主要是优点,也还是遗留了一些痛点篇幅所限,就不展开了


我要回帖

更多关于 lmstrong是什么意思 的文章

 

随机推荐