在模块顶部创建的变量不会自动被添加到全局共享作用域(模块顶部this的值为undefined),必须导出后,外部代码才可访问。
<script>
的type属性缺失或者包含一个javascript内容类型(如,text/javascript)时作为脚本加载;type属性值为“module”时支持模块加载(如果浏览器不支持,会自动向后兼容)。
<script type="text/javascript">
var a = 'a';
</script>
<script type="module">
var b = 'b';
</script>
<script>
console.log(window.a); // a
console.log(window.b); // undefined
</script>
注意:type="module"
会自动应用defer属性。
也可将模块作为Worker加载,let worker = new Worker("module.js", {type: "module"})
。Worker脚本只能从引用的网页相同的源加载;Worker模块不会完全受限(可以加载并访问具有适当的跨域资源共享头的文件)
{}
const foo = 'bar';
export foo; // Error Unexpected token, expected {
export {foo}; // Correct
export { sum as add }
import { add as sum }
import { identifier1, identifier2} from './example.js'
identifier1 = 1; // Error
为了兼容更多浏览器和Node环境,导入模块路径之前要包含/、./、../来表示导入的文件
import * as example from './example.js'
example.identifier1;
import { identifier1 } from './example.js'
import { identifier2 } from './example.js'
上述example只被加载一次!
/*person.js*/
var name = 'ligang'
function setName(newName) {
name = newName;
}
export {setName, name};
<!--person1.vue-->
<template>
<div>
<p>{{name}}</p>
<button @click="setName">设置名称</button>
</div>
</template>
<script>
import {name, setName} from './person.js'
export default {
data() {
return {
name: name
}
},
methods: {
setName() {
// name = 'lg';
setName('lg')
}
}
}
</script>
<!--person2.vue-->
<template>
<div>
<p>{{name}}</p>
</div>
</template>
<script>
import {name} from './person.js'
export default {
data() {
return {
name: name
}
}
}
</script>
在person1.vue
中点击“设置名称”按钮,切换到person2.vue
,name名称会变为‘lg’!注意,不能在person1.vue
中直接修改name,因为import语句为变量、函数和类创建的是只读绑定,而不是像正常变量一样简单地引用原始绑定!
import sum, {color} from './example.js'
上述,sum为默认值,color为非默认值
import './example.js'