是否可以在ES6模块导入中使用子资源完整性?

时间:2017-08-21 19:58:04

标签: javascript http ecmascript-6

给出这样的代码:

import { el, mount } from 'https://unpkg.com/redom@3.2.1/dist/redom.es.js';

是否有某种方法可以让subresource integrity verification确保CDN资产返回预期的内容?

4 个答案:

答案 0 :(得分:2)

您还必须通过

定义模块
<script type="module" integrity="..." src="https://unpkg.com/redom@3.2.1/dist/redom.es.js">

您要问的是具体需要更改ECMAScript本身,并且目前还没有proposal,因此我希望它不会很快出现。


但是对于UNPKG,如果您相信UNPKG和Cloudflare不会弄乱内容,就可以了。只要您指定版本,npm或软件包作者都无法修改文件。

答案 1 :(得分:2)

在HTML文档中,您可以使用<link rel="modulepreload">元素执行该完整性检查,不幸的是,当前仅在Blink浏览器中支持该检查。

// default script
import( "https://unpkg.com/redom@3.2.1/dist/redom.es.js" )
  .then( module => console.log( 'from default script:', typeof module.List ) )
  .catch( console.error );
<link rel="modulepreload" 
  href="https://unpkg.com/redom@3.2.1/dist/redom.es.js"
  integrity="sha384-notthecorrectsha">
<script type="module">
  import { List } from "https://unpkg.com/redom@3.2.1/dist/redom.es.js";
  console.log( 'from module script:', typeof List );
</script>

没有完整性检查的相同代码段:

// default script
import( "https://unpkg.com/redom@3.2.1/dist/redom.es.js" )
  .then( module => console.log( 'from default script:', typeof module.List ) )
  .catch( console.error );
<link rel="modulepreload" 
  href="https://unpkg.com/redom@3.2.1/dist/redom.es.js">
<script type="module">
  import { List } from "https://unpkg.com/redom@3.2.1/dist/redom.es.js";
  console.log( 'from module script:', typeof List );
</script>

请注意,此检查也将适用于“子模块”,但不适用于工人。

答案 2 :(得分:1)

您可以使用RequireJS,并将代码转换为AMD或UMD来实现此目的。 RequireJS有一个钩子onNodeCreated,它允许您在将脚本标记添加到文档之前访问它。 您可以将sri属性添加到script代码:

  

onNodeCreated:function(node,config,module,path){      node.setAttribute(&#39; integrity&#39;,integrityForModule);      node.setAttribute(&#39; crossorigin&#39;,&#39; anonymous&#39;);   }

信用:https://stackoverflow.com/a/37065379

我使用Webpack(目标为UMD)和RequireJS。 将相关模块放在webpack配置文件的external部分中,因此模块不会编译成转换后的代码。

答案 3 :(得分:1)

由于Deno为其依赖项(并且没有现成的软件包管理器)支持此类导入,并且节点leaving open将来有机会导入非文件URL,因此此问题变得更加重要

虽然@fregante提到的尚无建议的内容仍然准确,但https://github.com/WICG/import-maps/issues/174包括(通过引用的slide presentation)讨论了在修改语法时提出的一些问题(例如,可传递的)依赖项缓存无效)以支持SRI以及其他可能的选择。