fjs library

FJS - Flutter JavaScript Engine

A comprehensive Flutter library for executing JavaScript code within Flutter applications. Built on top of the QuickJS engine, FJS provides a seamless integration between Dart and JavaScript, enabling developers to run JavaScript code, use Node.js modules, and create hybrid applications.

Features

  • Synchronous and Asynchronous Execution: Support for both sync and async JavaScript operations
  • Module System: Full ES6 module support with dynamic loading capabilities
  • Node.js Compatibility: Built-in support for common Node.js modules
  • Bidirectional Communication: Call JavaScript from Dart and Dart from JavaScript
  • Memory Management: Fine-grained control over memory usage and garbage collection
  • Type Safety: Type-safe conversion between Dart and JavaScript values
  • Error Handling: Comprehensive error reporting and debugging capabilities

Basic Usage

import 'package:fjs/fjs.dart';

// Create an async runtime
final runtime = await JsAsyncRuntime.withOptions(
  builtin: JsBuiltinOptions.all(),
);

// Create a context
final context = await JsAsyncContext.from(runtime: runtime);

// Create an engine
final engine = JsEngine(context: context);

// Initialize the engine
await engine.initWithoutBridge();

// Execute JavaScript code
final result = await engine.eval(
  source: JsCode.code('Math.random() * 100'),
);

print('Random number: ${result.value}');

Module Usage

// Load a module from file
await engine.declareNewModule(
  module: JsModule.path(module: 'utils', path: '/path/to/utils.js'),
);

// Execute a function from a module
final result = await engine.eval(
  source: JsCode.code('''
    const { add } = await import('utils');
    add(2, 3);
  '''),
);

Bridge Communication

await engine.init(
  bridge: (value) async {
    print('JavaScript called: ${value.value}');
    return JsResult.ok(JsValue.string('Hello from Dart!'));
  },
);

Classes

JsAsyncContext
JsAsyncRuntime
JsBuiltinOptions
Options for configuring builtin Node.js modules.
JsBytecode
JsCode
JsContext
JsEngine
JsError
JsEvalOptions
Options for JavaScript code evaluation.
JsModule
Represents a JavaScript module.
JsModuleBytecode
Serialized QuickJS bytecode for a single ES module.
JsModuleBytecodeBundle
A collection of precompiled ES modules, optionally with a designated entry module.
JsModuleBytecodeOptions
Options used when compiling an ES module into QuickJS bytecode.
JsResult
JsRuntime
JsScriptBytecode
Serialized QuickJS bytecode for a classic global script.
JsScriptBytecodeOptions
Options used when compiling non-module JavaScript into QuickJS bytecode.
JsValue
LibFjs
Main entrypoint of the Rust API
MemoryUsage

Enums

JsBytecodeEndianness
Byte order to use when writing QuickJS module bytecode.

Extensions

JsBuiltinOptionsPatterns on JsBuiltinOptions
Adds pattern-matching-related methods to JsBuiltinOptions.
JsCodePatterns on JsCode
Adds pattern-matching-related methods to JsCode.
JsErrorPatterns on JsError
Adds pattern-matching-related methods to JsError.
JsEvalOptionsPatterns on JsEvalOptions
Adds pattern-matching-related methods to JsEvalOptions.
JsModuleBytecodeBundlePatterns on JsModuleBytecodeBundle
Adds pattern-matching-related methods to JsModuleBytecodeBundle.
JsModuleBytecodeOptionsPatterns on JsModuleBytecodeOptions
Adds pattern-matching-related methods to JsModuleBytecodeOptions.
JsModuleBytecodePatterns on JsModuleBytecode
Adds pattern-matching-related methods to JsModuleBytecode.
JsModulePatterns on JsModule
Adds pattern-matching-related methods to JsModule.
JsResultPatterns on JsResult
Adds pattern-matching-related methods to JsResult.
JsScriptBytecodeOptionsPatterns on JsScriptBytecodeOptions
Adds pattern-matching-related methods to JsScriptBytecodeOptions.
JsScriptBytecodePatterns on JsScriptBytecode
Adds pattern-matching-related methods to JsScriptBytecode.
JsValuePatterns on JsValue
Adds pattern-matching-related methods to JsValue.