[英]Unable to import external JS library into web application
我正在尝试制作一个基本的 web 应用程序,它将<textarea>
中的 markdown 转换为 HTML。 为此,我想使用 PageDown 库,SO 也使用它: https://code.google.com/archive/p/pagedown/wikis/PageDown.wiki 。
我下载了 PageDown 源代码,将其解压缩并放在包含我的 HTML/JS 文件的顶级目录中。 所以目录结构是这样的:
.
├── index.html
├── main.js
├── pagedown
│ ├── LICENSE.txt
│ ├── Markdown.Converter.js
│ ├── Markdown.Editor.js
│ ├── Markdown.Sanitizer.js
│ ├── README.txt
│ ├── demo
│ ├── local
│ ├── node-pagedown.js
│ ├── package.json
│ ├── resources
│ └── wmd-buttons.png
└── style.css
然后我尝试通过以下方式加载它:
main.js
:
import { Converter } from 'Markdown.Converter.js'
var text = "**Markdown rocks**"
var converter = new Markdown.Converter();
var html = converter.makeHtml(text);
index.html
:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="style.css">
<script type="module" src="main.js" defer></script>
<script type="module" src="./pagedown/Markdown.Converter.js"></script>
<script type="module" src="./pagedown/Markdown.Sanitizer.js"></script>
<script type="module" src="./pagedown/Markdown.Editor.js"></script>
<title>Text</title>
</head>
<body>
<textarea name="" id="textinput" cols="30" rows="10"></textarea>
<div id="output"></div>
</body>
</html>
然后我使用 VSCode Live Server 扩展在 Chrome 中运行代码。 我得到以下 output:
Uncaught TypeError: Failed to resolve module specifier "Markdown.Converter.js". Relative references must start with either "/", "./", or "../".
Markdown.Sanitizer.js:8 Uncaught TypeError: Cannot read properties of undefined (reading 'Converter')
at Markdown.Sanitizer.js:8:28
at Markdown.Sanitizer.js:108:3
(anonymous) @ Markdown.Sanitizer.js:8
(anonymous) @ Markdown.Sanitizer.js:108
Markdown.Editor.js:92 Uncaught ReferenceError: Markdown is not defined
at Markdown.Editor.js:92:5
at Markdown.Editor.js:2301:3
因此,我尝试将Markdown.*
脚本的路径更改为/pagedown/Markdown.*.js
和pagedown/Markdown.*.js
,但两者都出现了相同的错误。
我不确定我在这里做错了什么。
您需要将Markdown.Converter.js
中的import
路径更改为main.js
的相对位置:
import { Converter } from './pagedown/Markdown.Converter.js';
但是如果你现在尝试这个,你会得到一些错误,比如:
未捕获的语法错误:请求的模块“./pagedown/Markdown.Converter.js”未提供名为“Converter”的导出
这是因为Markdown.Converter.js
不是 ESM JavaScript 文件。 我们可以告诉这一点,因为它没有export
语句。
我们不得不呼吁的是加载脚本的“老式”版本,因为这些脚本将它们的库代码设置为“全局”scope。 我们可以在Markdown.Converter.js
中看到这一点,因为在它的前几行中,它的语句没有包含在任何其他 scope 中:
var Markdown;
因此,为了让这些脚本能够访问全局 scope 以便main.js
可以“访问”它们的代码,我们需要从这些脚本中删除type="module"
,因为(根据MDN 文档):
除非显式附加到全局 object,否则模块定义的变量将作用于模块。
所以现在你的index.html
应该是
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="style.css">
<script type="module" src="main.js"></script>
<script src="./pagedown/Markdown.Converter.js"></script>
<script src="./pagedown/Markdown.Sanitizer.js"></script>
<script src="./pagedown/Markdown.Editor.js"></script>
<title>Text</title>
</head>
<body>
<textarea name="" id="textinput" cols="30" rows="10"></textarea>
<div id="output"></div>
</body>
</html>
注意:根据上述相同的MDN 文档:
加载模块脚本时无需使用
defer
属性(参见<script>
属性); 模块会自动延迟。
我们不需要main.js
脚本上的defer
。
现在Markdown
位于 main.js 可用的全局main.js
中,我们不再需要import
语句,因此您的整个main.js
现在应该如下所示:
var text = "**Markdown rocks**"
var converter = new Markdown.Converter();
var html = converter.makeHtml(text);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.