浏览器的 JS 模块化支持观察记录

浏览器的 JS 模块化支持观察记录

1、具体实现
  • 文件结构

    module_test
    ├── test.html
    ├── test.js
    └── math.js

  1. index.html
html 复制代码
<!doctype html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>test</title>
    </head>

    <body></body>

    <script type="module" src="test.js"></script>

    <!-- <script type="module">
        import { add } from "./math.js";

        const result = add(2, 3);
        console.log(result);
    </script> -->
</html>
  1. test.js
js 复制代码
import { add } from "./math.js";

const result = add(2, 3);
console.log(result);
  1. math.js
js 复制代码
export function add(a, b) {
    return a + b;
}
2、测试
  • 直接在浏览器中打开 test.html 文件,输出如下错误信息

    Access to script at 'file:///D:/WebCode/module_test/test.js' from origin 'null' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: chrome-extension, chrome-untrusted, data, edge, http, https, isolated-app.
    Failed to load resource: net::ERR_FAILED
    Unsafe attempt to load URL file:///D:/WebCode/module_test/test.html from frame with URL file:///D:/WebCode/module_test/test.html. 'file:' URLs are treated as unique security origins.

3、问题原因
  • 这是 ES Modules 在 file:// 协议下的 CORS 限制,这是浏览器的安全策略
  1. 浏览器将 file:// 协议视为不安全的 null origin

  2. ES Modules 要求通过 HTTP/HTTPS 协议加载,不能使用 file:// 协议

  3. file:// 页面加载另一个 file:// 文件被视为跨域请求

4、处理策略
  • 使用 VSCode 的 Live Server 插件,打开 test.html 文件
5、补充学习
js 复制代码
import { add } from "math.js";

const result = add(2, 3);
console.log(result);
  • test.js,写成上述内容,通过 Live Server 插件,打开 test.html 文件,输出如下错误信息

    Uncaught TypeError: Failed to resolve module specifier "math.js". Relative references must start with either "/", "./", or "../".

  1. 浏览器必须明确知道模块的完整路径,裸模块名(不以 /./../ 开头)不会被浏览器自动解析

  2. 使用相对路径导入模块,import { add } from "./math.js"

相关推荐
一心只读圣贤书4 分钟前
AI 驱动前端测试实战:从需求文档到 Playwright 自动化用例
前端·人工智能
拖孩10 分钟前
用 AI 重解千年观音灵签,做了一个微信小程序,每天摇一摇,命运给你回应
前端·后端·微信小程序
難釋懷21 分钟前
Nginx日志
前端·网络·nginx
倾听醉梦语24 分钟前
React/Vite/Next.js 前端开发工具 SpotPatch:点击页面元素精准定位 JSX/TSX 源码
javascript·react·ai编程·vite·next.js·前端开发工具
Web极客码1 小时前
用 Python 搭建工具调用 Agent 的调试过程
java·服务器·前端
2401_881828321 小时前
简易文本处理网页工具|AI 通识课第三次作业
前端·javascript·html
2601_963869951 小时前
【计算机毕业设计】基于Java的潮牌购物网站系统的设计与实现
java·开发语言·课程设计
Ai拆代码的曹操1 小时前
Dubbo 2.7.5 的线程上下文陷阱:从版本演进看 AllChannelHandler 的设计之痛
前端·dubbo·safari
障碍的枫子1 小时前
Vue组件导出&渲染
前端·javascript·vue.js
开开心心就好1 小时前
视频播放器完美解码集成三款播放器切换使用
前端·人工智能·智能手机·电脑·音视频·virtualenv·pygame