如何从飞镖架静态文件处理程序提供聚合物应用程序?

How to serve a polymer application from dart shelf static file handler?

我正在尝试使用货架静态服务器为聚合物应用程序提供服务。我创建下一个结构:


    聚合物应用程序
      - pubspec.yml
      - 垃圾桶
          - server.dart
      - 网络
          - index.html
      - 库
          - main_app.dart
          - main_app.html

在server.dart里面我放了这段代码:

import 'dart:io' show Platform;
import 'dart:async' show runZoned;
import 'package:path/path.dart' show join, dirname;
import 'package:shelf/shelf_io.dart' as io;
import 'package:shelf_static/shelf_static.dart';

void main() {
  // Assumes the server lives in bin/ and that `pub build` ran
  var pathToBuild = join(dirname(Platform.script.toFilePath()),
      '..', 'web');

  var handler = createStaticHandler(pathToBuild,
      defaultDocument: 'index.html');

  var portEnv = Platform.environment['PORT'];
  var port = portEnv == null ? 9999 : int.parse(portEnv);

  runZoned(() {
    io.serve(handler, '0.0.0.0', port);
    print("Serving $pathToBuild on port $port");
  },
  onError: (e, stackTrace) => print('Oh noes! $e $stackTrace'));
}

剩下的就是 dart 编辑器创建的模板聚合物应用程序。

问题是,当我尝试从浏览器访问 localhost:9999 时,它显示了下一个错误:


    加载资源失败:服务器响应状态为 404(未找到)
      http://localhost:9999/packages/paper_elements/roboto.html
    加载资源失败:服务器响应状态为 404(未找到)
      http://localhost:9999/packages/polymertest/main_app.html
    加载资源失败:服务器响应状态为 404(未找到)
      http://localhost:9999/packages/polymer/init.dart
    加载文件时发生错误:package:polymer/init.dart

我想这样做是为了更快的开发方式。在那种情况下,我不需要在每次进行更改时都构建 polymer-dart 应用程序。

您可以将 serveFilesOutsidePath: true 传递给 createStaticHandler()

 var handler = createStaticHandler(pathToBuild,
   defaultDocument: 'index.html',
   serveFilesOutsidePath: true);

此外,在开发过程中,您可以使用 pub serveshelf_proxy 进行增量构建。有关示例,请参阅 here

dev中shelf_proxy在prod中shelf_static的组合很有用。聪明的飞镖团队想出了将它们结合起来的想法,我在莫吉托中借鉴了这个想法。您可以按如下方式使用

import 'package:mojito/mojito.dart';

final app = mojito.init();

app.router..addStaticAssetHandler('/ui');

该代码是 here,如果您愿意,可以复制它