Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用模块语法时,所有脚本标记都必须是模块类型吗_Javascript_Module - Fatal编程技术网

Javascript 使用模块语法时,所有脚本标记都必须是模块类型吗

Javascript 使用模块语法时,所有脚本标记都必须是模块类型吗,javascript,module,Javascript,Module,我目前正在考虑将我的一些个人库转换为项目的模块语法。此项目未使用Node.js或React等框架。我可能会在模块语法中使用其中的一些,而其他的则不会 假设我有一个对象CookiePickerCookiePicker不是作为模块编写的,因此它不会导出任何函数CookiePicker确实导入了一个对象,DOMFactory,以卸载一些工作。在HTML中包含只包含对象/函数定义的CookiePicker.js时,似乎我必须使用type=“module” 稍后在HTML中,我打开了一个脚本标记,以实际使

我目前正在考虑将我的一些个人库转换为项目的模块语法。此项目未使用Node.js或React等框架。我可能会在模块语法中使用其中的一些,而其他的则不会

假设我有一个对象
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 -->


这样做很好,可能是最好的方式。

太棒了,非常感谢!太棒了,非常感谢!