大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力。
什么是 mojo.js The Mojolicious real-time web framework for Node.jsMojolicious 是适用于 Node.js 的实时 Web 框架。使用 TypeScript 编写,集成最新的 JavaScript 功能,为超媒体驱动的后端 Web 服务精心设计。
mojo.js 的典型特征包括:
比 Express.js 快 3 倍,比 Mojolicious 快 15 倍实时 Web 框架,可让开发者轻松将单个文件设计为结构良好的 MVC Web 应用程序开箱即用,功能强大,具有 RESTful 路由、WebSockets、插件、命令、日志记录、模板、内容协商、会话管理、表单和 JSON 验证、测试框架、静态文件服务器、集群模式、CGI 检测、一流的 Unicode 支持等强大的 Web 开发工具包,开发者可以将其用于各种应用程序,独立于 Web 框架高性能 HTTP 和 WebSocket 客户端 / 服务器实现,支持 HTTPS/WSS、cookie、重定向、urlencoded/multi-part 表单、文件上传、JSON/YAML、HTML/XML、模拟、API 测试、HTTP/SOCKS 代理、UNIX 域套接字和 gzip 压缩没有前端框架,mojo.js 用于后端,用 TypeScript 编写,具有非常整洁的类和基于 async/await 的 API全新代码基于数十年开发 Mojolicious 和 Catalyst 的经验,免费且开源目前 mojo.js 在 Github 通过 MIT 协议开源,是一个值得关注的前端开源项目。
如何使用 mojo.js开发者需要安装 Node.js 18.0.0 或更高版本:
$ npm install @mojojs/core也可以参考 mojojs 官方提供的高质量衍生项目 @mojojs/dom、@mojojs/path、@mojojs/pg 和 @mojojs/template。
安装相关依赖后,通过编写下面四行代码就构成了一个完整的 Web 应用程序:
import mojo from '@mojojs/core';const app = mojo();app.get('/', ctx => ctx.render({text: 'Hello Mojo!'}));// 调用 render 函数渲染内容app.start();在这样方便的单文件原型中使用所有最新的 Node.js 和 HTML 功能,并将其设计成结构良好的模型 - 视图 - 控制器 (Model-View-Controller) Web 应用程序。比如下面的示例:
import mojo from '@mojojs/core';const app = mojo();// 实例化 app 应用app.get('/', async ctx => { await ctx.render({inline: inlineTemplate});});// 注册一个 websocket 服务,而且是开箱即用app.websocket('/title', ctx => { ctx.plain(async ws => { // 直接使用 es6 的 async/await for await (const url of ws) { const res = await ctx.ua.get(url); const html = await res.html(); const title = html.at('title').text(); await ws.send(title); } });});app.start();// 启动项目渲染内联页面内容const inlineTemplate = `<script> const ws = new WebSocket('<%= ctx.urlFor('title') %>'); ws.onmessage = event => {document.body.innerHTML += event.data}; ws.onopen = event => {ws.send('https://mojolicious.org') };</script>`;mojo 提供了丰富的插件生态用于共享和组织应用程序扩展,其作为 NPM 模块或应用程序的一部分进行分发,开发者可以使用 app.plugin() 注册插件。
import mojo, {jsonConfigPlugin} from '@mojojs/core';// Create application with default configurationconst app = mojo({config: {foo: 'default value'}});app.plugin(jsonConfigPlugin, {file: 'myapp.conf'});// Return configured foo valueapp.get('/foo', async ctx => { const foo = ctx.config.foo; await ctx.render({json: {foo}});});app.start();mojo 通过 ctx.session() 方法使用基于加密 cookie 的会话,而且开箱即用。请注意,所有会话数据都会序列化为 JSON。
import mojo from '@mojojs/core';const app = mojo();// 在 action 和模板中访问 session 内容app.get('/counter', async ctx => { const session = await ctx.session(); if (session.counter === undefined) session.counter = 0; session.counter++; await ctx.render({inline: inlineCounter}, {session});});app.start();const inlineCounter = `Counter: <%= session.counter %>`;参考资料https://github.com/mojolicious/mojo.js
https://mojojs.org/
https://thecurioustechnoid.com/category/perl/