javascript - Flask:如何使用 ES6 模块?
问题描述
我有一个正在工作的 Flask 应用程序,我正在尝试重构它以使用 ES6 导入。我不需要它在旧浏览器上运行,并且 ES6 导入在现代浏览器中工作而无需转译,对吗?
我现在只是通过 Flask 的内置服务器运行它。生产应用程序是通过 gevent 提供的,但我显然还没有进行这些更改。
以下是我到目前为止所尝试的。我哪里出错了?
视图.py
@app.route('/home')
def serve_home():
return render_template('home.html')
格式化.js
export function formatNumber(...) {
...
}
尝试 1
主页.html
<script type="text/javascript" src="/static/js/main.js"></script>
main.js
import {formatNumber} from "/static/js/formatting.js";
错误(main.js,第 1 行)
Uncaught SyntaxError: Unexpected token {
尝试 2
- 将脚本类型更改为“模块”
主页.html
<script type="module" src="/static/js/main.js"></script>
错误(main.js,第 1 行)
加载模块脚本失败:服务器以“text/plain”的非 JavaScript MIME 类型响应。根据 HTML 规范对模块脚本强制执行严格的 MIME 类型检查。
尝试 3
- 将两个 Javascript 文件的扩展名从“js”更改为“mjs”
主页.html
<script type="module" src="/static/js/main.mjs"></script>
主要的.mjs
import {formatNumber} from "/static/js/formatting.mjs";
错误(main.mjs,第 1 行)
加载模块脚本失败:服务器以“application/octet-stream”的非 JavaScript MIME 类型响应。根据 HTML 规范对模块脚本强制执行严格的 MIME 类型检查。
解决方案
对于那些遇到错误的人:
The server responded with a non-JavaScript MIME type [...]
...您需要确认 python 正在返回您的 JS 文件的预期 mimetype。
>>> import mimetypes
>>> mimetypes.guess_type("notExists.js")
('text/javascript', None)
对于我自己,使用 Windows 平台从(例如 Flask 的开发服务器)托管 Web 服务器,我发现我需要更新注册表以将文件扩展名与text/javascript
.
例如,在注册表编辑器中:
- 在 HKEY_CLASSES_ROOT 下,找到
.js
(.mjs
如果使用它) - 查看“内容类型”的值。它必须说
text/javascript
, NOTtext/plain
, orapplication/octet-stream
, 等等。
推荐阅读
- eclipse - 使用 maven 打包非 src 目录
- airflow - 多个 Airflow XCOM
- swift - Swift 扩展 - 可选
- android - 给定一个资源名称,是否有可能找到在哪个片段中使用?
- python - 如何在循环中比较特定位置的两个值,并在 Pandas Dataframe 中的一系列值中附加数据
- sql - 尝试使用实用 SQL 指南导入 CSV
- java - android studio-来自片段的网络服务请求
- java - LinkedLists 中的节点引用
- javascript - Busboy 文件事件未触发,在请求正文中接收文件作为缓冲区
- java - Mockito then() should() 匹配不包括一个参数的参数