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/geodesy@2.4.0/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/geodesy@2.4.0/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/geodesy@2.4.0/dms.js');
alert(Dms.toLat(-3.62, 'dms'));
})();
</script>
最后是一些疯狂的通用解决方案:
<script type="module">
import Dms from 'https://cdn.jsdelivr.net/npm/geodesy@2.4.0/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>
添加回答
举报