尝试使用导入的 js 函数启动 html 页面时出现“CORS 策略已阻止从源‘null’访问脚本”错误

Posted

技术标签:

【中文标题】尝试使用导入的 js 函数启动 html 页面时出现“CORS 策略已阻止从源‘null’访问脚本”错误【英文标题】:"access to script from origin 'null' has been blocked by CORS policy" error while trying to launch an html page using an imported js function 【发布时间】:2020-05-11 17:41:17 【问题描述】:

我在尝试使用从另一个文件导入函数的 javascript 文件启动 html 页面时遇到此错误:

Access to script at 'file:///C:/Users/bla/Desktop/stuff/practice/jsPractice/funcexecute.js' 
from origin 'null' has been blocked by CORS policy: 
Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https.
Failed to load resource: net::ERR_FAILED

这是html代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8'>
    <meta http-equiv='X-UA-Compatible' content='IE=edge'>
    <title>Page Title</title>
    <meta name='viewport' content='width=device-width, initial-scale=1'>

</head>
<body>
    <script type = 'module' src='funcexecute.js'></script>

</body>
</html>

从html调用的js文件:(funcexecute.js)

import sumup from '/funcfile.js';
console.log(sumup(1,2));

进口模块: (funcfile.js)

function sumup(num1, num2)
    return num1+num2;

export default sumup;

我该如何解决这个问题? (我使用 vscode)

【问题讨论】:

您的文件需要使用 http 或 https 协议,而不是 file:///。要么使用远程服务器,要么设置本地服务器,现在很容易,例如使用 NodeJS 和Express。然后您就可以使用localhost 访问您的文件 【参考方案1】:

这个问题是因为文件是直接打开的;所以似乎有几种方法可以解决这个问题:一种是禁用 Chrome 中的安全性,尽管尽我所能,但我无法让它放弃幽灵:我尝试了各种组合 -disable- Chrome 的网络安全标志。

第二种选择是在本地托管网站。有那么一小会儿,我考虑过使用 IIS Express 之类的东西;但幸运的是,我遇到了这个工具,它可以为你在本地托管一个网站。

它可以作为 npm 包安装: npm install --global http-server 安装后,您只需导航到相关目录,然后输入 http-server:

C:\repos\webanimations\animated-columns-optimised>http-server
Starting up http-server, serving ./
Available on:
  http://192.168.1.79:8080
  http://127.0.0.1:8080
  http://172.17.230.225:8080
Hit CTRL-C to stop the server

然后您可以导航到您的特定页面;例如:

http://127.0.0.1:8080/columns

并且不再出现 CORS 错误(目前还不能正常工作,但那是完全不同的故事)。

【讨论】:

【参考方案2】:

    type = "module" 通常与 webpack 一起使用。

    如果不使用webpack,需要启动静态服务

    你可以使用http-server -p 8003启动一个服务

【讨论】:

【参考方案3】:

在您的脚本链接中将type="module" 替换为type="JavaScript"

【讨论】:

这不起作用。它修复了错误但不是问题。仍然不会将 javascript 文件加载到浏览器中。如果你使用 type = "module" 你必须在服务器上打开它。【参考方案4】:

右键单击 Visual Studio Code 中的 index.html 文件,选择 Open with Live Server。 这将解决您的问题。

JS 中的导出/导入仅适用于服务器,它们不适用于本地机器(对此有不同的代码)。 下面是如何做到这一点,一步一步instructions。

【讨论】:

【参考方案5】:

您不能在不使用服务器的情况下将脚本文件用作模块。 Take a look here

这里有一些选项

使用 Live Server(VS Code 的扩展) 从节点使用http-server 模块(通过npm 安装,然后从您的项目目录运行http-server .) 使用来自 python 的 http.server 包 使用 wamp(或灯)服务器

简而言之,type="module" 不能与 file 协议一起使用

【讨论】:

以上是关于尝试使用导入的 js 函数启动 html 页面时出现“CORS 策略已阻止从源‘null’访问脚本”错误的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript函数导入不起作用

尝试运行 jupyter notebook 时出现导入错误

将 JSON 数据导入 App.js 时出现问题

将 Moment js 与 ASP 5/MVC6 一起使用时出现“未捕获的 SyntaxError:意外的令牌导入”

在 Next.js 中动态导入模块时出现“forwardRef”错误

导入 index.js 时出现 scss 错误