- ####模块化
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>