- ####模块化
js不支持模块化
在es6之前,社区制定了一套规范:
| 规范 | 作用 |
|---|---|
| Commonjs | 主要用于服务端 nodejs require(‘http’) |
| AMD | requireJs,culJs |
| CMD | seaJs |
es出来,统一服务端和客户端模块规范
注意:使用模块化需要放在服务器环境
- 如何定义模块:
// 此处可以是 let / const export const a=12;
或者
<script > // 使用 export default 出来的东西,则不需要使用 {} export default 12; export const e = 13; export const b = 14; export const c = 1; </script>
或者
<script > let a = 12; let b = 13; export {a, b}; </script>
- 如何使用模块:
- 注意:只要是 export 导出的东西,在使用时都要使用 {}
- 如果是使用 export default 出来的东西,则不需要
import优点:\
无论一个库导入多少次,只会执行一次
import可以是绝对路径或者是相对路径
import ‘./model.1.js’; 如果这样用,相当于引入文件
有提升效果,import会自动提升到顶部,首先执行
导入的模块,如果里面js的内容改了,外面的也会跟着改
- 在HTML中写入:
<script type="module">
import 绝对路径 / 相对路径
// 或者
import {aaa, bbb, ccc} from './module/2.js';
// 或者
import * as modTwo from './module/2.js';
</script>
- 在导入时起别名:
<script >
import {aaa, bbb, ccc} from './module/2.js';
console.log(aaa);
console.log(bbb);
console.log(ccc);
console.log("split---");
// 也可以在导入时起别名:
import {aaa as a, bbb as b, ccc as c} from './module/2.js';
console.log(a);
console.log(b);
console.log(c);
</script>
- 为模块起别名:
<script >
import * as modTwo from './module/2.js';
console.log(modTwo);
</script>
- 一起使用 export default 导出东西的时候
<scripot>
// import a from './module/3.js';
//要使用 export default 和 export导出的东西的时候:
import a, {e, b, c} from './module/3.js';
console.log(a);
console.log(e);
console.log(b);
console.log(c);
</scripot>
- 可以在导入的js源文件中再导入另一个js:
html文件:
<script type="module">
import mod, {show, sum, e, f} from './module/4.js';
let p1 = new mod.Person('张三', 18);
console.log(p1.showName());
show();
sum();
console.log('split---');
console.log(e, f);
</script>
4.js文件:
import {e, f} from './5.js';
console.log('split---');
const a = 12;
const b = 15;
export {
a,
b,
sum,
show,
e,
f
}
const sum = () => {
console.log(a + b);
return a + b;
}
const show = () => {
console.log('执行了show');
return 1;
}
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
showName() {
return `我的名字是${this.name}`;
}
}
export default {
Person
}
5.js文件:
export const e = 101;
export const f = 4;
- import有提升效果:
<script type="module">
// 验证提升效果
console.log('提升了吗');
import mod, {show, sum, e, f} from './module/4.js';
console.log(e);
</script>
- 导入的模块,如果里面js的内容改了,外面的也会跟着改,不像common规范如:
html文件:
<script type="module">
import {a, b} from './module/6.js';
// 导入的模块,如果里面js的内容改了,外面的也会跟着改
console.log(a, b);
setTimeout(() => {
console.log(a, b);
}, 3000);
</script>
6.js:
let a = 12;
let b = 13;
setTimeout(() => {
a = 11111;
}, 2000);
export {a, b};
- import可以动态引入:
import()类似于node里面的require,可以动态引入
默认import语法不能写入if等语句里
可以使用按需加载的方式来加载:\<script > import ('https://code.jquery.com/jquery-1.12.4.js').then(res => { $(function () { $('body').css({ background: 'red' }) }) }) </script>此种方法的优点:
- 按需加载
- 可以写在if中
- 路径也可以是动态的
import() 的返回值是一个promise对象
- 模块化的动态引入:
不能在if中直接引入 import 语法,
import() 的返回值是一个promise对象
可以使用 import() 来引入,如:<script > // 也可以引入绝对地址 import('./module/1.js').then(res => { console.log(res.a+res.b); }); </script>
可以进行动态加载,如:
<script > let sign = 1; function config() { switch (sign) { case 1: return './module/1.js'; break; case 2: return './module/2.js'; break; } } import(config(1)).then(res => { }); </script>
也可以使用promise.all(),如:
<script >
Promise.all([
import('./module/1.js'),
import('./module/2.js'),
]).then(([mod1,mod2])=>{
console.log(mod1);
console.log(mod2);
})
</script>