给出这样的代码:
import { el, mount } from 'https://unpkg.com/redom@3.2.1/dist/redom.es.js';
是否有某种方法可以让subresource integrity verification确保CDN资产返回预期的内容?
答案 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以及其他可能的选择。