For AI agents: the complete documentation index is available at /next/zh/llms.txt, the full documentation bundle is available at /next/zh/llms-full.txt, and this page is available as Markdown at /next/zh/guide/scripting-runtime/index.md.
Lynx
  • 简体中文
  • JavaScript 运行时与 WebAssembly

    JavaScript 运行时

    Lynx 最大的特点之一是双线程架构(更多信息请参阅 ReactLynx 编程思想),JavaScript 代码会在主线程后台线程两个线程上同时运行。两个线程使用了不同的 JavaScript 引擎作为其运行时。

    主线程

    Lynx 主线程负责处理直接影响屏幕像素渲染的任务,包括:执行主线程脚本、处理布局和渲染图形等等。

    主线程使用由 Lynx 团队官方维护的 PrimJS 作为运行时,它是基于 QuickJS 的轻量、高性能 JavaScript 引擎,可以为主线程提供良好的运行性能。

    后台线程

    相对于主线程,Lynx 的后台线程处理的任务不直接影响屏幕像素的显示。这包括在后台运行的脚本和任务,它们与主线程分开运行。这样可以让主线程专注于处理用户交互和渲染,从而提升整体性能。

    • Android:出于包体积和性能的综合考量,我们默认使用 PrimJS 作为运行时
    • iOS:默认情况下使用 JavaScriptCore 作为运行时,但由于调试协议支持度的原因,当需要调试的时候,需要切换到 PrimJS

    虽然这些运行时引擎环境非常相似,但最终可能会遇到一些不一致的地方,请避免依赖任何运行时的具体细节。

    WebAssembly

    从 Lynx 3.8 开始,Lynx 基于 PrimJS 集成为 Android 提供了基础的 WebAssembly 支持。

    这项能力面向常见的模块加载和执行场景,目前仅支持后台线程。目前 Lynx 并未暴露完整的 WebAssembly JavaScript API。支持范围和当前限制请参考 WebAssembly

    JavaScript 语法转换

    Lynx 双线程运行时支持最高的 ECMAScript 版本分别是:

    当然,你可以使用新版本的 JavaScript 语法来编写代码,在构建时会使用 SWC 进行语法转换,而不需要等待 JavaScript 运行时支持。

    JavaScript Polyfills

    Info

    仅在 iOS 系统中注入 Polyfills

    完整的 polyfill 列表见仓库

    除了对语法进行转换外,Lynx 还对很多内置的 API 提供了 polyfill,包括:

    Built-in Objects

    Array

    ArrayBuffer

    Date

    Number

    Object

    Promise

    Reflect

    RegExp

    String

    Symbol

    模块系统

    在开发 Lynx 项目时,开发者可封装和引用 JS 模块。

    模块现在支持 ESModuleCommonJS 规范的模块系统。ESModule 和 CommonJS 可以混用。

    推荐使用 ESModule,能够更好地进行 TreeShaking

    模块名

    无论使用什么模块,都需要指定模块名。模块名可以是:

    • 一个相对路径:./common.js
    • 一个 npm 包名:lodash(不支持依赖 C++ addon,不支持依赖 NodeJS 的内置库)
    • 经过 alias 处理的路径:@common/foo.js

    CommonJS

    CommonJS 使用 require(path) 来引入一个模块。使用 module.exportsexports 来导出一个模块。

    common.js
    ReactLynx
    common.js
    const lodash = require('lodash'); // can require npm packages
    function hello(name) {
      console.log(`Hello ${lodash.capitalize(name)} !`);
    }
    
    function goodbye(name) {
      console.log(`Goodbye ${name} !`);
    }
    
    module.exports.hello = hello;
    exports.goodbye = goodbye;
    Tip
    • require 可以出现在代码的任何位置,不需要在顶部。

    • require 一个模块,会同步执行该模块内的代码。

    • require 会缓存返回的对象,对同一路径多次 require,会返回同一个对象。即:

    require('foo') === require('foo'); // true

    ESModule

    ESModule 使用 import 来引入一个模块。使用 export 来导出一个模块。 importexport 必须位于代码的最外层

    同时 ESModule 可以使用 import() 来进行动态导入模块。

    utils.js
    ReactLynx
    utils.js
    export function getAge() {
      return 11;
    }
    
    export default function (add1, add2) {
      return add1 + add2;
    }
    除非另有说明,本项目采用知识共享署名 4.0 国际许可协议进行许可,代码示例采用 Apache License 2.0 许可协议进行许可。