Flutter模板引擎插件angel3_jael的使用

发布于 1周前 作者 h691938207 来自 Flutter

Flutter模板引擎插件angel3_jael的使用

Angel 3框架提供了对Jael 3模板引擎的支持,通过angel3_jael插件可以方便地在你的Flutter应用中集成Jael模板引擎。以下是如何安装和使用这个插件的详细说明和示例代码。

安装

在你的pubspec.yaml文件中添加angel3_jael依赖:

dependencies:
  angel3_jael: ^8.0.0

使用

配置Angel以使用Jael模板引擎非常简单,只需要调用app.configure方法即可:

import 'package:angel3_framework/angel3_framework.dart';
import 'package:angel3_jael/angel3_jael.dart';
import 'package:file/file.dart';

AngelConfigurer myPlugin(FileSystem fileSystem) {
    return (Angel app) async {
        // Connect Jael to your server...
        await app.configure(
        jael(fileSystem.directory('views')),
      );
    };
}

配置选项

package:angel3_jael默认支持缓存视图和压缩HTML输出以提高性能。在开发环境中,你可能希望禁用这些功能:

jael(viewsDirectory, cacheViews: false, minified: false);

请注意,该包使用的是package:file而不是dart:io

基本示例

以下是一个基本的服务器设置示例,它可以渲染存储在名为views目录中的Jael模板:

import 'package:angel3_framework/angel3_framework.dart';
import 'package:angel3_jael/angel3_jael.dart';
import 'package:file/local.dart';
import 'package:logging/logger.dart';

void main() async {
  var app = Angel();
  var fileSystem = const LocalFileSystem();

  await app.configure(
    jael(fileSystem.directory('views')),
  );

  // 渲染views/index.jael的内容
  app.get('/', (req, res) => res.render('index', {'title': 'ESKETTIT'}));

  app.use(() => throw AngelHttpException.notFound());

  app.logger = Logger('angel')
    ..onRecord.listen((rec) {
      print(rec);
      if (rec.error != null) print(rec.error);
      if (rec.stackTrace != null) print(rec.stackTrace);
    });

  var server = await app.startServer(null, 3000);
  print('Listening at http://${server.address.address}:${server.port}');
}

性能优化

对于处理大量初始请求的情况,考虑使用jaelTemplatePreload来预加载所有JAEL模板到外部缓存:

var templateDir = fileSystem.directory('views');

// 预加载JAEL视图模板到缓存
var viewCache = <String, Document>{};
jaelTemplatePreload(templateDir, viewCache);

// 将缓存注入到JAEL渲染器
await app.configure(
  jael(fileSystem.directory('views'), cache: viewCache),
);

示例代码

以下是完整的示例代码,展示如何使用angel3_jael插件创建一个简单的Web服务器:

import 'dart:convert';
import 'package:angel3_framework/angel3_framework.dart';
import 'package:angel3_framework/http.dart';
import 'package:angel3_jael/angel3_jael.dart';
import 'package:file/local.dart';
import 'package:logging/logger.dart';

main() async {
  var app = Angel();
  var http = AngelHttp(app);
  var fileSystem = const LocalFileSystem();

  await app.configure(
    jael(fileSystem.directory('views')),
  );

  app.get(
      '/',
      (req, res) =>
          res.render('index', {'title': 'Sample App', 'message': null}));

  app.post('/', (req, res) async {
    var body = await req.parseBody().then((_) => req.bodyAsMap);
    print('Body: $body');
    var msg = body['message'] ?? '<unknown>';
    return await res.render('index', {
      'title': 'Form Submission',
      'message': msg,
      'json_message': json.encode(msg),
    });
  });

  app.fallback((req, res) => throw AngelHttpException.notFound());

  app.logger = Logger('angel')
    ..onRecord.listen((rec) {
      print(rec);
      if (rec.error != null) print(rec.error);
      if (rec.stackTrace != null) print(rec.stackTrace);
    });

  var server = await http.startServer('127.0.0.1', 3000);
  print('Listening at http://${server.address.address}:${server.port}');
}

通过以上步骤和示例代码,你可以轻松在Flutter项目中集成并使用angel3_jael插件来管理模板渲染。


更多关于Flutter模板引擎插件angel3_jael的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter模板引擎插件angel3_jael的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用angel3_jael模板引擎插件的示例。angel3_jael是一个用于Dart和Flutter的模板引擎,常用于服务器端渲染。尽管Flutter主要用于客户端开发,但你可以在某些场景(例如生成动态HTML内容)下使用它。

首先,你需要在你的pubspec.yaml文件中添加angel3_jael依赖:

dependencies:
  flutter:
    sdk: flutter
  angel3_jael: ^4.0.0  # 请检查最新版本号

然后运行flutter pub get来安装依赖。

接下来,我们来看一个使用angel3_jael渲染模板的示例。

示例代码

  1. 创建一个模板文件

在你的项目根目录或assets文件夹中创建一个名为template.jael的文件,并添加以下内容:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{{ title }}</title>
</head>
<body>
    <h1>{{ heading }}</h1>
    <p>{{ message }}</p>
</body>
</html>
  1. 加载和渲染模板

在你的Flutter项目中,你可以使用rootBundle来加载模板文件,并使用angel3_jael进行渲染。以下是一个完整的示例:

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:angel3_jael/angel3_jael.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Angel3 Jael Example'),
        ),
        body: FutureBuilder<String>(
          future: _renderTemplate(),
          builder: (context, snapshot) {
            if (snapshot.connectionState == ConnectionState.done) {
              if (snapshot.hasError) {
                return Text('Error: ${snapshot.error}');
              } else {
                return SingleChildScrollView(
                  child: Padding(
                    padding: const EdgeInsets.all(8.0),
                    child: Text(snapshot.data ?? ''),
                  ),
                );
              }
            } else {
              return Center(child: CircularProgressIndicator());
            }
          },
        ),
      ),
    );
  }

  Future<String> _renderTemplate() async {
    // 加载模板文件
    String templateContent = await rootBundle.loadString('assets/template.jael');

    // 解析模板
    var context = Context()
      ..assign('title', 'My Page Title')
      ..assign('heading', 'Welcome to My Page')
      ..assign('message', 'This is a message rendered using Angel3 Jael template engine.');

    // 创建Jael引擎并渲染模板
    var engine = JaelEngine();
    var renderer = engine.rendererFor(templateContent);
    String result = await renderer(context);

    return result;
  }
}

注意:确保你的template.jael文件已经被放置在assets文件夹中,并在pubspec.yaml中声明该文件夹为资源文件夹:

flutter:
  assets:
    - assets/template.jael

运行应用

现在你可以运行你的Flutter应用,应该会看到一个页面,页面内容是根据template.jael模板渲染出来的。

这个示例展示了如何在Flutter项目中使用angel3_jael模板引擎来加载和渲染HTML模板。尽管这在客户端应用中不常见,但在某些需要动态生成HTML内容的场景中可能会很有用。

回到顶部