[英]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.