【发布时间】:2015-03-14 06:34:36
【问题描述】:
TL:DR; 添加type="application/dart" 使Assetic 忽略过滤器标志filter=MyCustomFilter。
删除后一个属性类型触发filter=MyCustomFilter 就好了。但我需要过滤器和属性。如何让 Assetic 在具有 type=application/dart 属性时触发我的自定义过滤器?
我相信部分问题在于它只接受type=application/javascript 或空的html type 属性来触发过滤器。我不知道从这里去哪里。
详细信息:
我想制作一个类似于javascripts 的标签,但用于 Dart 文件。
{% darts
'@AcmeBundle/Resources/dart/AcmeMain/web/main.dart'
%}$
<script type="application/dart" src="{{ asset_url }}"></script>
{% enddarts %}
我希望能够使用@ 表示法而不是/bundles/etc/
经过一番搜索,我尝试了以下方法:
我扩展了Symfony\Bundle\AsseticBundle\Twig\AsseticExtension
我继承了以下函数:
public function getTokenParsers()
{
return array(
$this->createTokenParser('javascripts', 'js/*.js'),
$this->createTokenParser('stylesheets', 'css/*.css'),
$this->createTokenParser('image', 'images/*', true),
);
}
在我自己的子类中,我添加到父数组$this->createTokenParser('darts', 'dart/*.dart')。
当我有的时候,这最初是有效的。
{% darts '@MyBundle\...\main.dart' filter="MyCustomFilter" %}
<script src="{{ asset_url }}"></script>
但是,引导加载程序 dart.js 需要 type="application/dart 属性才能使引导程序正常工作。
只要我添加了所需的属性,编辑源文件就不会重新编译。它几乎被忽略了。以下代码被忽略,不会触发MyCustomFilter过滤器:
{% darts '@MyBundle\...\main.dart' filter="MyCustomFilter" %}
<script type="application/dart" src="{{ asset_url }}"></script>
我似乎无法从这里找到下一步该去哪里,看看这一切是如何运作的本身就让人难以抗拒。我只需要将type="application/dart 识别为有效,这样我的MyCustomFilter 就会被触发。
【问题讨论】:
-
为什么不直接使用
{% javascripts %}标签和 dart2js 过滤器呢?这样,您的 Dart 脚本将被编译为 JavaScript,避免与浏览器的兼容性问题。 -
@Nic 如果没有以
.dart结尾的文件名,dartbootloader 将无法工作。我可以修改引导加载程序,但每次更新引导加载程序时,我都必须记住在我的代码工作之前修改引导加载程序。这就是为什么我想要一个合适的解决方案。 -
我没有使用 Dart 的经验,但是将其编译为普通的旧 javascript 是否不需要客户端编译?
-
@Nic 从来没有任何客户端编译,飞镖代码在服务器上编译为 javascript。无论如何,它的工作方式是飞镖引导加载程序
dart.js检查未编译的main.dart。如果浏览器不支持它,它会加载main.js。现在,在资产的某个地方,当type="application/dart添加到<script>属性中时,它会阻止我的过滤器触发编译代码。所以引导加载程序无法加载main.js,因为assetic 从一开始就没有编译过。
标签: php symfony dart twig assetic