拦截 HTML 进口

Intercepting HTML imports

我在网上找不到任何东西。我正在使用 Polymer 1.6,并且正在尝试对元素进行延迟加载。到目前为止,我已经成功地延迟加载它们并且速度大大提高了。

我正在做 App Shell 架构,我在其中捆绑(通过缩小和固化)导航栏和抽屉工作所需的所有脚本。 但是,一旦我这样做,就会有许多 HTML 导入是 App Shell 的一部分,它们将被调用,因为它们的名称不同。

我可以从我的元素中删除 HTML 导入,但这很容易出错。 注意: 我知道 HTML 导入只执行一次,但由于它们是捆绑包的一部分,浏览器不知道如何阻止它的加载。

所以我想做的是拦截 HTML 导入,检查元素是否是 App Shell 的一部分,如果它已经存在则阻止它的加载。

像这样:

 var appShellComponents : [
    'polymer'
    'my-navbar',
    'paper-button',
    'app-drawer'

    document.addEventListener('HTMLImportEvent', function(event){
       //Untested code below
         var href = event.srcTarget.href;
         var component = href.substr(href.lastIndexOf('/').replace('.html','');
        if(appShellComponents.indexOf(component) > -1){
         //Element has been loaded, reject the import. 
            return;
           }

    });

我还需要一种方法来使用其他浏览器(如 Firefox)进行此操作。显然,Polymer 使用了一个 polyfill 来调用 AJAX。

最好的方法是在服务器端处理文件,使用像 gulpgrunt 这样的程序例如。

您可以将 <link> 元素的属性 rel='import' 替换为您自己的自定义名称,例如 rel='lazy-import',然后在浏览器中使用您自己的模块加载器处理它们。


如果您想在客户端运行时处理链接,您可以等待 link 上的 onload 事件(或 document 上的 HTMLImportsLoaded 事件),但我想这些事件对于你想要实现的目标来说已经太晚了(实际上这取决于不同的 Web 组件是如何设计的)。


但是使用 polyfill(适用于 Firefox 和 Internet Explorer),这是可能的,因为您可以修补实现 XMLHttpRequest 调用的代码。不幸的是,它不适用于 Chrome 和 Opera,因为 <link> 是本地解析和处理的,而导入文件中的 <script> 在下载时立即执行。


一种解决方法是将 Web 组件移动到文件夹中,这样就不会在初始相对 href URL 中找到它们(或者使用带有错误 [=45] 的 <base> 元素=]).然后您只需在需要时插入 good <link>