【问题标题】:Dart+Polymer as a webpage/app/extension not working outside of Dart EditorDart+Polymer 作为网页/应用程序/扩展在 Dart 编辑器之外无法工作
【发布时间】:2014-07-17 03:53:15
【问题描述】:

我在 Dart Editor (Win7Pro64) 中编写了一个 Dart-Polymer 应用程序。一切都在 Dartium 中完美运行并在 Chrome 中作为 Javascript 运行,但我无法在 IDE 之外加载工作版本。

在 Chrome (36.0.1985.103 beta-m) 中打开 html 文件(只有一个)时,背景图像在那里,但 UI 的其余部分不存在或没有样式(纸元素似乎不存在)。 Dart/JavaScript 似乎也没有执行。

将其作为解压扩展程序加载到 Chrome 中(作为应用程序或扩展程序,请参阅下面的清单)会产生几乎完全相同的结果。 UI 组件都在那里,但是没有样式并且没有 Dart/JavaScript 功能。但是,纸张波纹效果确实有效,所以可能只是我的脚本没有运行。

以防万一,我不仅尝试了build/web/ 文件夹,还尝试了out/web/web/ 文件夹。

编辑:app.html 将在 Chrome 中成功打开(从 Windows)。但是,当作为 Chrome 应用程序或扩展程序加载时,我会遇到一大堆错误:http://pastebin.com/KRXnaTXi。由于它们似乎都与 CSP 相关,因此这里是第一个:

Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed 
source of script in the following Content Security Policy directive: "default-src 
'self' chrome-extension-resource:". Note that 'script-src' was not explicitly set, so 
'default-src' is used as a fallback.
 observe.js:988
(anonymous function) observe.js:988
(anonymous function) observe.js:992
(anonymous function) wrappers.js:374

/编辑

好的,进入代码:

pubspec.yaml

当作为扩展加载时,我使用了csp: true,并确保构建的 html 文件使用了*.precompiled.js 脚本。

name: app
description: desc
dependencies:
    polymer: ">=0.12.0 <0.13.0"
    core_elements: ">=0.1.1 <0.2.0"
    paper_elements: ">=0.1.0+2 <0.2.0"
    crypto: ">=0.9.0"
    cipher: ">=0.7.0 <0.8.0"
    lawndart: ">=0.6.5 <0.7.0"
    chrome: ">=0.6.0 <0.7.0"    
transformers:
- chrome
- polymer:
    entry_points: 
    - web/app.html
    csp: false

尽管不需要从编辑器(在 Dartium/Chrome 选项卡中)运行应用程序,但我有一个清单可以将其作为应用程序加载。

ma​​nifest.json

{
  "manifest_version": 2,

  "name": "app",
  "description": "desc",
  "version": "0.1.0",

  "app": {
    "background": {
      "scripts": ["background.js"]
    }
  },

  "icons": {
    "128": "images/icon128.png",
    "48": "images/icon48.png",
    "16": "images/icon16.png"
  },

  "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self';" 
}

如果作为扩展加载,“app”:部分将替换为:

"browser_action": {
    "default_icon": "images/icon16.png",
    "default_popup": "app.html"    
},

测试的另一件事是build.dart 中的--deploy 参数。

import 'package:polymer/builder.dart';

main(args) {
  build(entryPoints: ['web/grujin.html'],
        options: parseOptions(args));
//        options: parseOptions(['--deploy']));
}

app.html

<!DOCTYPE html>
<html>
<head>
<!-- <script src='packages/web_components/platform.js'></script>
     not necessary anymore with Polymer >= 0.14.0 -->
<script src='packages/web_components/dart_support.js'></script>
<link rel='import' href='packages/paper_elements/paper_input.html'>
<!-- Other imports ... -->
<link rel='stylesheet' href='app.css' shim-shadowdom>
<script src='packages/browser/dart.js'></script>
</head>
<body fullbleed unresolved>
<paper-input id='passwd' label='password'></paper-input>
<!-- ... -->
<script>
  document.addEventListener('polymer-ready', function() {
    var navicon = document.getElementById('navicon');
    var drawerPanel = document.getElementById('drawerPanel');
    navicon.addEventListener('click', function() {
      drawerPanel.togglePanel();
    });
  });
</script>
<script type='application/dart' src='app.dart'></script>
</body>
</html>

app.dart

import 'dart:html';
import 'package:polymer/polymer.dart';
import 'package:paper_elements/paper_input.dart';
import 'package:core_elements/core_input.dart';
import 'package:paper_elements/paper_toast.dart';
import 'package:paper_elements/paper_checkbox.dart';
import 'package:paper_elements/paper_button.dart';
import 'package:paper_elements/paper_fab.dart';
import 'package:paper_elements/paper_slider.dart';
import 'package:lawndart/lawndart.dart';

export 'package:polymer/init.dart';

void main() {      
  initPolymer().run(() {
    // code here works most of the time
    Polymer.onReady.then((_) {     
      // some things must wait until onReady callback is called
      // for an example look at the discussion linked below

      PaperInput passwd = querySelector('#passwd');              
      InputElement input = passwd.shadowRoot.olderShadowRoot.querySelector('input');
      input.type = 'password';
      // initialize polymer elements, etc...
    });
  });
}

【问题讨论】:

  • “无法加载”或“无法正常工作”是什么意思。有任何错误信息吗?
  • 我用错误消息的粘贴箱编辑了问题(似乎与 csp 相关)。如果你想自己尝试,这里是回购github.com/jphilli85/grujin.git
  • 错误的第一行有加载聚合物的 CSP 问题;行:&lt;script src="packages/polymer/src/js/polymer/polymer.js"&gt;&lt;/script&gt; 被引用。

标签: dart dart-polymer dart-editor


【解决方案1】:

我试过了,它在 Dartium (36.0.1985.97 (282401))、Chrome (Version 36.0.1985.125) 和 Firefox (30.0) 中看起来不错,但在 Dartium 作为扩展时却不行。我想知道为什么它甚至从web 加载为扩展我认为扩展应该只从app 加载(参见https://github.com/dart-lang/chromedeveditor/tree/master/ide/app)。

似乎 paper-elements/core-elements 在 Chrome 应用中存在已知问题

【讨论】:

  • 项目中没有app/目录。我通常使用 Chrome 的扩展界面从 build/web/ 目录加载应用程序/扩展。你链接的问题似乎正是我的问题,我要试试这个“硫化”的东西。
  • 硫化后还有两个内联脚本。一个在&lt;core-toolbar&gt; 内部,一个在&lt;core-menu&gt; 内部。这是两个元素的图像:oi60.tinypic.com/v5v12a.jpg。我试着做alt registration,但脚本仍然出现在 Chrome 开发工具中。我应该离线下载这些元素并修改它们还是有更好的方法?
  • 这些元素的更新版本应该很快就会发布。也许这已经解决了。同时,您可以尝试使用 GitHub 存储库 git@github.com:dart-lang/core-elements.git 中的元素。
【解决方案2】:

为了进一步扩展 Gunter 的答案,这就是我在 Windows 中使用 vulcanize 的方式;允许作为扩展程序或应用程序成功加载。

  1. http://nodejs.org/#download 下载并安装 Node.js。
  2. 打开命令提示符,然后键入npm install -g vulcanize 将 vulcanize 可执行文件安装到%AppData%\npm\node_modules\vulcanize\bin\。 (我相信 -g 选项可以省略)
  3. 使用--csp 选项在.\build\web\ 中的HTML 文件上运行可执行文件(有关其他命令选项,请参阅here)。

    vulcanize --csp -o build\web\app.html build\web\app.html

【讨论】:

    【解决方案3】:

    不需要使用 NodeJS - 可以通过在 pubspec.yaml 文件中的转换器中添加 CSP 选项来实现相同的目的:

    transformers:
      - polymer:
          csp: true
      - $dart2js:
          csp: true
    

    确保在任何代码更改后运行Pub Build,并使用build/web 下的文件作为您的扩展。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 2015-09-14
      • 2013-12-14
      • 1970-01-01
      • 2014-12-27
      • 2016-02-20
      • 2014-09-29
      相关资源
      最近更新 更多