4 回答

TA貢獻1943條經驗 獲得超7個贊
您可以創建一個腳本類型模塊,導入所需的對象并將它們放入窗口中。{您的對象的名稱}如下:
<script type="module">
import { theItem } from "/path/to/module.js";
window.theItem = theItem;
</script>
其余代碼可以在常規 js 中。

TA貢獻1773條經驗 獲得超3個贊
您無法使用 . 在模塊中創建全局變量var。要訪問該函數,您可以將其從文件中導出:
export myFunction;
并將其導入到您需要的文件中:
import {myFunction} from "./relativeFilePath";
或者,如果您想從模塊內創建全局變量,您可以將該變量直接放入對象中window:
window.myFunction = function() {
//code
};

TA貢獻1856條經驗 獲得超11個贊
因此,據我了解,現在我必須從模塊導入該類,而不是包含 js 文件。當我嘗試這樣做時,我收到一個控制臺錯誤,只有模塊可以導入。
對于傳統的靜態語句來說確實如此import
。
但是,值得注意的是,動態import()
運算符(另一種導入模塊的異步方式)可用于將模塊導入到經典 javascript 文件以及其他模塊中。
MDN注釋:
該
import()
語法通常稱為動態導入,是一種類似函數的表達式,允許將 ECMAScript 模塊異步動態加載到潛在的非模塊環境中[...]
和:
[...]您可能需要使用動態導入:
當您處于非模塊環境中時(例如 [...]腳本文件)。
例子:
// /my-classic-javascript-file.js
const myAsyncFunction = async () => {
? const { myImportedClass } = await import('/path/to/module.js');
}

TA貢獻1877條經驗 獲得超1個贊
屬性window設置器解決方案:
<script type="module">
import Dms from 'https://cdn.jsdelivr.net/npm/[email protected]/dms.js';
alert(Dms.toLat(-3.62, 'dms'));
window.Dms = Dms;
</script>
<script>
let Dms;
Object.defineProperty(window, 'Dms', {
get(){
return Dms;
},
set(val){
Dms = val;
window.dispatchEvent(new Event('dms-set'));
}
});
window.addEventListener('dms-set', () => alert('SECOND TIME: ' + Dms.toLat(-3.62, 'dms')));
</script>
一些承諾的解決方案:
<script type="module">
import Dms from 'https://cdn.jsdelivr.net/npm/[email protected]/dms.js';
alert(Dms.toLat(-3.62, 'dms'));
window.Dms = Dms;
</script>
<script>
promisifyGlobal('Dms');
Dms.then(Dms => alert('SECOND TIME: ' + Dms.toLat(-3.62, 'dms')));
function promisifyGlobal(name){
let global, promise = new Promise(resolve => {
Object.defineProperty(window, name, {
get(){
return promise;
},
set(val){
global = val;
resolve(global);
}
});
});
}
</script>
您可以輕松地動態導入到非模塊腳本中:
<script>
(async () => {
const {default: Dms} = await import('https://cdn.jsdelivr.net/npm/[email protected]/dms.js');
alert(Dms.toLat(-3.62, 'dms'));
})();
</script>
最后是一些瘋狂的通用解決方案:
<script type="module">
import Dms from 'https://cdn.jsdelivr.net/npm/[email protected]/dms.js';
alert(Dms.toLat(-3.62, 'dms'));
</script>
<script>
// this script will handle all imports
// tweak to import several exports and named exports
for(const script of document.querySelectorAll('script[type=module]')) {
const regex = /import\s+([^\s]+)\s+from\s+["\']([^"\']+)/g;
let matches;
while(matches = regex.exec(script.textContent)){
const [, name, url] = matches;
const src = `import ${name} from '${url}'; export default ${name};`;
window[name] = new Promise(resolve => {
import(`data:text/javascript, ${src}`).then(({default:imported}) => {
setTimeout(() => resolve(imported));
});
});
}
}
</script>
<script>
Dms.then(Dms => alert('SECOND TIME: ' + Dms.toLat(-3.62, 'dms')));
</script>
添加回答
舉報