Javascript 使用模块语法时,所有脚本标记都必须是模块类型吗
我目前正在考虑将我的一些个人库转换为项目的模块语法。此项目未使用Node.js或React等框架。我可能会在模块语法中使用其中的一些,而其他的则不会 假设我有一个对象Javascript 使用模块语法时,所有脚本标记都必须是模块类型吗,javascript,module,Javascript,Module,我目前正在考虑将我的一些个人库转换为项目的模块语法。此项目未使用Node.js或React等框架。我可能会在模块语法中使用其中的一些,而其他的则不会 假设我有一个对象CookiePickerCookiePicker不是作为模块编写的,因此它不会导出任何函数CookiePicker确实导入了一个对象,DOMFactory,以卸载一些工作。在HTML中包含只包含对象/函数定义的CookiePicker.js时,似乎我必须使用type=“module” 稍后在HTML中,我打开了一个脚本标记,以实际使
CookiePicker
CookiePicker
不是作为模块编写的,因此它不会导出任何函数CookiePicker
确实导入了一个对象,DOMFactory
,以卸载一些工作。在HTML中包含只包含对象/函数定义的CookiePicker.js
时,似乎我必须使用type=“module”
稍后在HTML中,我打开了一个脚本标记,以实际使用CookiePicker.js
中定义的对象。但是,我得到一个错误,说我的对象没有定义。如果将type=“module”
添加到此脚本标记,则在导入CookiePicker
对象后,代码将按预期执行
不可能用普通JS语法链接模块语法吗?
相关代码
/js/modules/DOMFactory.mjs
export default function DOMFactory()
{
...
}
import DOMFactory from '/js/Modules/DOMFactory.mjs';
function CookiePicker(arg1, arg2)
{
...
}
CookiePicker.prototype.init= function()
{
...
}
/CookiePicker.js
export default function DOMFactory()
{
...
}
import DOMFactory from '/js/Modules/DOMFactory.mjs';
function CookiePicker(arg1, arg2)
{
...
}
CookiePicker.prototype.init= function()
{
...
}
/CookiePicker.html
<html>
...
<script type="module" src="CookiePicker.js"></script>
...
<!-- ReferenceError
<script>
var s = new CookiePicker('selector', '');
s.init();
</script>
-->
<!-- Works once I add an export to the CookiePicker function -->
<script type="module">
import CookiePicker from './CookiePicker.js'
var s = new CookiePicker('selector', '');
s.init();
</script>
</html>
...
...
从“./CookiePicker.js”导入CookiePicker
var s=新的CookiePicker('选择器','');
s、 init();
假设我有一个对象CookiePicker。CookiePicker不是作为模块编写的,因此它不导出任何函数
它使用导入
,因此它已作为模块编写-只有模块才能使用导入
(或导出
)关键字。所以,你说得对:
在HTML中包含CookiePicker.js(它只包含对象/函数定义)时,似乎我必须使用type=“module”
不能用简单的JS语法链接模块语法吗
不容易。模块通常是异步运行的,并且它们故意不污染全局对象,因此从外部非模块脚本连接到它们并不是那么自然
虽然您可以在模块完全加载时为事件添加事件监听器,并让最外层的模块触发该监听器,但这样做很难看,也不是真正使用模块的方式。正确的方法是,由于涉及到模块,根据您的需求,将所有内容都变成模块
<!-- Works once I add an export to the CookiePicker function -->
这样做很好,而且可能是最好的方式
假设我有一个对象CookiePicker。CookiePicker不是作为模块编写的,因此它不导出任何函数
它使用导入
,因此它已作为模块编写-只有模块才能使用导入
(或导出
)关键字。所以,你说得对:
在HTML中包含CookiePicker.js(它只包含对象/函数定义)时,似乎我必须使用type=“module”
不能用简单的JS语法链接模块语法吗
不容易。模块通常是异步运行的,并且它们故意不污染全局对象,因此从外部非模块脚本连接到它们并不是那么自然
虽然您可以在模块完全加载时为事件添加事件监听器,并让最外层的模块触发该监听器,但这样做很难看,也不是真正使用模块的方式。正确的方法是,由于涉及到模块,根据您的需求,将所有内容都变成模块
<!-- Works once I add an export to the CookiePicker function -->
这样做很好,可能是最好的方式。太棒了,非常感谢!太棒了,非常感谢!