由于 unsafe-eval,Vue.js 3 扩展在使用“vue-cli-service build”时中断

Posted

技术标签:

【中文标题】由于 unsafe-eval,Vue.js 3 扩展在使用“vue-cli-service build”时中断【英文标题】:Vue.js 3 extension breaks while using "vue-cli-service build" due to unsafe-eval 【发布时间】:2021-01-17 10:42:38 【问题描述】:

我正在使用基于Kocal's project 的vue 3、vue-router 和vuex 开发一个chrome 扩展,它在底层使用vue-cli。我尽可能使用单一文件组件,并广泛使用 vue 绑定。 在开发模式下一切正常,但我最近尝试为生产构建应用程序,但遇到了这个错误部分渲染:

chunk-vendors.f6de00a6.js:11 EvalError: Refused to evaluate a string as javascript because 'unsafe-eval' is not an allowed source of script in the following Content Security Policy directive: "script-src 'self'".

经过几天的挖掘,我的理解是 webpack 或 vue 编译系统通过 eval 脚本引用/注入代码来搞乱 CSP。由于我对此还很陌生,所以我很难通过阅读来区分我能做什么。

我尝试了不同的方法:

为运行时定义 $vue 别名仅在 vue.config.js 中构建(假设通过在运行前编译代码但以新错误结束:Uncaught TypeError: Object(...) is not a function for o=Object(n["withScopeId"])("data-v-21ae70c6"); 来删除不安全的 eval) 在根目录下使用render() 函数 将"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'", 添加到manifest.json 将组件切换到 render() 以查看我是否有更好的机会进行部分渲染,但最终没有显示任何内容,尽管正在执行来自渲染的 console.log。 在 vue.config 上向chainWebpack 拆分清单和内联清单添加配置

让我感到困惑的是,我无法摆脱unsafe-eval,充其量只是部分显示,最坏的是空白页。无论如何,绑定似乎都被取消了,使用路由器链接更改页面将给出一个空白页面。

编辑:从 webpack 挖掘编译代码并将最小化选项设置为 false 后,错误似乎来自供应商:vue-i18n

【问题讨论】:

【参考方案1】:

tl;dr:检查您的依赖项/包,包括您认为他们不会使用的那些 unsafe-eval

在深入研究了为 vue3 构建的 webpack 内部结构和组件之后,以下是要点:

使用单个文件组件和默认的 vue-cli 配置是可以的,因为它确实只需要 vue 运行时,所以没有未经请求的unsafe-eval webpack 配置如下:
  module.exports = 
    configureWebpack: 
      plugins: [
        new webpack.DefinePlugin(
          global: "window" // Placeholder for global used in any node_modules
        )
      ]
    ,
    ...
  ;
// Note that this plugin definition would break if you are using "unit-mocha" module for vue-cli

最后,问题是我用于 i18n vue-i18n@next 的依赖项,在删除它并切换到 chrome 的 i18n 方式后,它现在可以工作了。

【讨论】:

【参考方案2】:

eval 可能来自 Webpack,原因是全局范围界定问题。 更多详情见链接https://mathiasbynens.be/notes/globalthis

您可以尝试将此配置添加到vue.config.js

module.exports = 
  configureWebpack: 
    node: 
      global: false
    ,
    plugins: [
      new webpack.DefinePlugin(
        global: "window"
      )
    ]
  
;

【讨论】:

感谢您的建议。我在某处看到了 node: false config 但还没有尝试过。我将您的建议添加到我的 vue.config.js 中,但同样的问题仍然存在(部分渲染出现 eval 错误) 我一直在测试和测试,我至少有部分渲染的事实似乎表明 webpack 至少正确完成了部分编译。如果我要将 vue$ 别名更改为仅运行时构建,我确实有完整的空白屏幕。我认为问题可能出在其他地方。 ?如果仅运行时的 Vue 导致空白,这似乎表明模板没有被编译,但从 repo 看不出发生这种情况的原因。 很正常,vue-cli使用webpack预编译.vue,我给他运行时只给了vue.js这个预编译。它可能不会提供太多,但至少会编译部分 .vue 文件。

以上是关于由于 unsafe-eval,Vue.js 3 扩展在使用“vue-cli-service build”时中断的主要内容,如果未能解决你的问题,请参考以下文章

安装Vue.js devtools

VUE

如何获得符合 unsafe-eval 的 Fabric js 和 lodash js

即使添加了“unsafe-eval”,CSP 也会阻止对 function() 的调用

在没有“unsafe-eval”的情况下检查基本的ES6支持

vue实例-学习