您当前的位置:首页 > 电脑百科 > 程序开发 > 框架

一码跑遍众多小程序,饿了么开源自研多端框架 MorJS

时间:2023-04-18 11:21:49  来源:CSDN  作者:
作者 | MorJS 技术团队
出品 | 阿里巴巴终端技术

Mor (发音为 /mɔːr/,类似 more) 是饿了么开发的一款基于小程序 DSL 的,可扩展的多端研发框架

使用 MorJS,我们只需书写一套(微信或支付宝)小程序,就可以通过 MorJS 的转端编译能力,将源码分别编译出可以发布在不同端(微信/支付宝/百度/字节/钉钉/快手/QQ/淘宝/H5)的产物。MorJS 还支持小程序、小程序插件、小程序分包之间的形态转换,同时也配备了从源码到构建产物全阶段的插件体系,满足各类功能扩展,提升开发体验和开发效率。

以下是饿了么-美食外卖频道在微信、支付宝、抖音小程序及 H5 中的表现:

 

为什么要做 MorJS?

 

目前各大平台都相继推出了自己的小程序,饿了么 C 端业务需要在不同平台小程序进行投放,这些项目大多是以支付宝或微信原生 DSL 编写,面对业务渠道的不断增加,我们尝试了多种方法来兼容多端适配,但由于不同平台间小程序代码写法、能力支持的差异性逐步变大,过去的方案无法满足新业务的需求,我们需要一套跨端研发框架能解决以下诉求:

▶ 原生 DSL 支持,方便现有小程序 DSL 编写的存量业务使用;
▶ 降低性能开销,尽可能轻运行时,减少编译构建的时长;
▶ 便捷的使用,一键转换为支持各小程序平台使用的产物;
▶ 拓展的功能,提供针对大型复杂小程序的解耦方案;
▶ 灵活的配置,能够简单的增加修改多套不同端的项目配置;
▶ 产物优化能力,压缩构建产物体积,减少小程序包大小;

在明确这几点后,我们调研了业界所有主流技术框架,发现并没有能完全满足我们需求的方案,所以我们决定自研 MorJS。

 

 

如何使用?

 

MorJS 是基于小程序原生 DSL 进行扩展的,只要你掌握微信或支付宝任意一种小程序,那你就几乎掌握了 MorJS。

MorJS 提供了官方脚手架工具用于创建新项目,同时也支持已有小程序引入相关依赖接入 MorJS。

开始一个新项目

▶ MorJS 项目示例:https://Github.com/eleme/morjs/tree/mAIn/examples

1.创建项目,选定项目目录,在目录终端执行以下任一命令:
$ npm init mor # npm 创建项目$ yarn create mor # yarn 创建项目$ pnpm create mor # pnpm 创建项目

2.选择对应的工程类型,按照提示完成初始化操作

✔ 请选择工程类型 › 小程序✔ 请选择源码类型 › 微信小程序 DSL✔ 是否使用 Typescript … 否 / 是✔ 请选择 css 预处理器 › less✔ 请输入 小程序 的名称 … myApp✔ 请输入 小程序 的描述 … my first app✔ 用户名 … yourUserName✔ 邮箱 … your@gmail.com✔ 请输入 Git 仓库地址 … https://github.com/yourUserName/myapp✔ 请选择 npm 客户端 › npm / pnpm / yarn

3.执行编译命令启动项目:

 
$ npm run dev

4.多端产物已构建在_ dist_ 目录下,分别用对应平台的 IDE 打开即可开发预览

已有小程序项目接入

1.在已有项目中添加必要的依赖:

$ npm i @morjs/cli -D && npm i @morjs/core --save

2.在项目根目录下增加配置文件_ mor.config.ts_

import { defineConfig } from '@morjs/cli'
export default defineConfig([ // 第一套配置: 微信 DSL 编译 { name: 'wx', sourceType: 'wechat', // 源码类型: 微信 DSL target: 'wechat', // 编译目标: 微信 compileMode: 'bundle', // 编译模式: 打包模式 }, // 第二套配置: 微信转支付宝 { name: 'ali', sourceType: 'wechat', // 源码类型: 微信 DSL target: 'alipay', // 编译目标: 支付宝 compileMode: 'bundle', // 编译模式: 打包模式 }, // 第三套配置: 微信转 Web { name: 'web', sourceType: 'wechat', // 源码类型: 微信 DSL target: 'web', // 编译目标: Web compileMode: 'bundle', // 编译模式: 打包模式 }])

3.在_ package.json_ 中配置脚本:

{ "scripts": {+ "dev": "mor compile -w",+ "build": "mor compile --production" }}

4.在项目目录终端下执行编译命令启动项目:

 
$ npm run dev

5.多端产物已构建在_ dist _目录下,分别用对应平台的 IDE 打开即可开发预览。

 

 

MorJS 核心能力

 

多端编译:提供一码多端转换能力

从诞生之初,MorJS 的一个核心能力就是实现小程序一码多端的转换,让一套代码经过编译后对应的各端产物,分别在多个小程序平台上运行,让开发成本,招聘、管理、测试各方面成本都大幅下降。截止到目前,我们已经支持多数小程序平台的转换。

如果你对多端编译的实现感兴趣,可参见文档《MorJS 如何工作》:https://mor.eleme.io/guides/introduction/how-mor-works。

集成研发:提供复杂小程序解耦开发能力

随着业务需求的不断增加,很多小程序项目不可避免的会出现体积巨大化的问题。虽然小程序官方提供了小程序分包、小程序插件的解决方案,但基于同一个小程序代码库,众多分包、插件的迭代情况复杂,实际业务难以解耦。如果你的项目遇到类似的问题,可以使用 MorJS 提供的集成研发能力,把各个分包、插件、模块分成一个个独立的项目,并通过集成研发将小程序宿主和这些子模块通过拉包、编译、构建、合并等一系列处理,合并为一个完整小程序进行开发、调试和部署。

如果你对集成研发的实现感兴趣,可参见文档《复杂小程序集成》:https://mor.eleme.io/guides/advance/complex-miniprogram-integration。

形态互转:提供小程序多形态转换能力

随着投放场景的增加,不同业务在不同小程序端的形态可能并不相同。例如一个在支付宝端的小程序应用,在某些场景下希望他以分包的形式接入到微信小程序中。于是让项目在独立小程序、小程序插件、小程序分包应用形态间互相转换成为一个难题。

MorJS 提供的形态一体化能力,可以在尽量减少业务代码修改的前提下,提供同一个项目在以不同端(微信、支付宝、淘宝、抖音等)不同形态(小程序、小程序插件、小程序分包)间的转换能力。

如果你对形态一体化的实现感兴趣,可参见文档《小程序形态一体化》:https://mor.eleme.io/guides/advance/unity-of-forms。

H5 同构:提供小程序 DSL 转 H5 能力

除了多端多形态的小程序外,不少开发者还面临着 H5 场景的投放。对此, MorJS 提供将小程序项目转换为 Web 项目的能力。这一能力的核心是将小程序转换成一个基于 **React **的项目产物。无论是整个工程项目的转码、或是单个组件的编译,MorJS 都能够支持。

如果你对转 Web 开发的实现感兴趣,可参见文档《MorJS Web 开发》:https://mor.eleme.io/web/basic/quickstart

其他

除此上述核心能力外,MorJS 围绕小程序实现了一系列研发生态能力的建设,包括但不限于以下:

▶ 条件编译:提供对于多端或不同环境构建产出不同代码的能力,更加灵活的解决不同场景的适配问题;
▶ 产物压缩:提供了不同类型文件的最小化兼容压缩方式,并保留配置选项对高级压缩方案的扩展支持;
▶ Mock 能力:提供小程序本地 JSAPI mock 能力,解决开发阶段无法联调接口请求数据的痛点;

 

优势与现状

MorJS 的优势

如你所见,MorJS 是一套基于小程序 DSL (支付宝或微信) 的框架。他的易用性、标准化和灵活性,使得开发者能更好地专注于业务,降低研发、调试成本,提高开发者的工作效率。

使用现状

截止目前,MorJS 支持 4 种编译形态(小程序、小程序插件、小程序分包、H5),支撑了饿了么 C 端大多数业务在各个渠道上的研发和投放。通过 MorJS 的开源,我们期望能把其中的技术细节、架构设计和技术思考呈现给大家,为有类似多端同构需求的企业和开发者服务。

MorJS 为饿了么解决了大量业务在多端研发上的差异问题,让小程序开发的重心回到产品业务本身,减少使用者对多端差异兼容的投入,在通过开源让大家更好地了解和使用这项技术的同时,我们也希望能够借此吸引到更多志趣相投的小伙伴参与共建,一起加速小程序一码多端能力的发展。欢迎广大小程序开发者们与我们交流。以上是对 MorJS 的简单介绍,如果想要详细了解可通过下述方式:

▶ GitHub:https://github.com/eleme/morjs
▶ 官网地址:https://mor.eleme.io/


Tags: MorJS   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
一码跑遍众多小程序,饿了么开源自研多端框架 MorJS
Mor (发音为 /mɔːr/,类似 more) 是饿了么开发的一款基于小程序 DSL 的,可扩展的多端研发框架。...【详细内容】
2023-04-18  Search: MorJS  点击:(373)  评论:(0)  加入收藏
▌简易百科推荐
Web Components实践:如何搭建一个框架无关的AI组件库
一、让人又爱又恨的Web ComponentsWeb Components是一种用于构建可重用的Web元素的技术。它允许开发者创建自定义的HTML元素,这些元素可以在不同的Web应用程序中重复使用,并且...【详细内容】
2024-04-03  京东云开发者    Tags:Web Components   点击:(8)  评论:(0)  加入收藏
Kubernetes 集群 CPU 使用率只有 13% :这下大家该知道如何省钱了
作者 | THE STACK译者 | 刘雅梦策划 | Tina根据 CAST AI 对 4000 个 Kubernetes 集群的分析,Kubernetes 集群通常只使用 13% 的 CPU 和平均 20% 的内存,这表明存在严重的过度...【详细内容】
2024-03-08  InfoQ    Tags:Kubernetes   点击:(12)  评论:(0)  加入收藏
Spring Security:保障应用安全的利器
SpringSecurity作为一个功能强大的安全框架,为Java应用程序提供了全面的安全保障,包括认证、授权、防护和集成等方面。本文将介绍SpringSecurity在这些方面的特性和优势,以及它...【详细内容】
2024-02-27  风舞凋零叶    Tags:Spring Security   点击:(54)  评论:(0)  加入收藏
五大跨平台桌面应用开发框架:Electron、Tauri、Flutter等
一、什么是跨平台桌面应用开发框架跨平台桌面应用开发框架是一种工具或框架,它允许开发者使用一种统一的代码库或语言来创建能够在多个操作系统上运行的桌面应用程序。传统上...【详细内容】
2024-02-26  贝格前端工场    Tags:框架   点击:(47)  评论:(0)  加入收藏
Spring Security权限控制框架使用指南
在常用的后台管理系统中,通常都会有访问权限控制的需求,用于限制不同人员对于接口的访问能力,如果用户不具备指定的权限,则不能访问某些接口。本文将用 waynboot-mall 项目举例...【详细内容】
2024-02-19  程序员wayn  微信公众号  Tags:Spring   点击:(39)  评论:(0)  加入收藏
开发者的Kubernetes懒人指南
你可以将本文作为开发者快速了解 Kubernetes 的指南。从基础知识到更高级的主题,如 Helm Chart,以及所有这些如何影响你作为开发者。译自Kubernetes for Lazy Developers。作...【详细内容】
2024-02-01  云云众生s  微信公众号  Tags:Kubernetes   点击:(50)  评论:(0)  加入收藏
链世界:一种简单而有效的人类行为Agent模型强化学习框架
强化学习是一种机器学习的方法,它通过让智能体(Agent)与环境交互,从而学习如何选择最优的行动来最大化累积的奖励。强化学习在许多领域都有广泛的应用,例如游戏、机器人、自动驾...【详细内容】
2024-01-30  大噬元兽  微信公众号  Tags:框架   点击:(68)  评论:(0)  加入收藏
Spring实现Kafka重试Topic,真的太香了
概述Kafka的强大功能之一是每个分区都有一个Consumer的偏移值。该偏移值是消费者将读取的下一条消息的值。可以自动或手动增加该值。如果我们由于错误而无法处理消息并想重...【详细内容】
2024-01-26  HELLO程序员  微信公众号  Tags:Spring   点击:(86)  评论:(0)  加入收藏
SpringBoot如何实现缓存预热?
缓存预热是指在 Spring Boot 项目启动时,预先将数据加载到缓存系统(如 Redis)中的一种机制。那么问题来了,在 Spring Boot 项目启动之后,在什么时候?在哪里可以将数据加载到缓存系...【详细内容】
2024-01-19   Java中文社群  微信公众号  Tags:SpringBoot   点击:(86)  评论:(0)  加入收藏
花 15 分钟把 Express.js 搞明白,全栈没有那么难
Express 是老牌的 Node.js 框架,以简单和轻量著称,几行代码就可以启动一个 HTTP 服务器。市面上主流的 Node.js 框架,如 Egg.js、Nest.js 等都与 Express 息息相关。Express 框...【详细内容】
2024-01-16  程序员成功  微信公众号  Tags:Express.js   点击:(88)  评论:(0)  加入收藏
相关文章
    无相关信息
站内最新
站内热门
站内头条