JS 中的require 和 import 区别( 二 )

注意,模块整体加载所在的那个对象(上例是circle),应该是可以静态分析的,所以不允许运行时改变 。
import * as circle from './circle';// 下面两行都是不允许的circle.foo = 'hello';circle.area = function () {};6.export default
之前的例子中,使用import导入时,都需要知道模块中所要加载的变量名或函数名,用户可能不想阅读源码,只想直接使用接口,就可以用export default命令,为模块指定输出
// export-default.jsexport default function () { console.log('foo');}其他模块加载该模块时,import命令可以为该匿名函数指定任意名字 。
// import-default.jsimport customName from './export-default';customName(); // 'foo'export default也可以用于非匿名函数前 。
下面比较一下默认输出和正常输出 。
// 第一组export default function crc32() { // 输出 // ...}import crc32 from 'crc32'; // 输入// 第二组export function crc32() { // 输出 // ...};import {crc32} from 'crc32'; // 输入可以看出,使用export default时,import语句不用使用大括号 。
*******import和export命令只能在模块的顶层,不能在代码块之中 。否则会语法报错 。
这样的设计,可以提高编译器效率,但是没有办法实现运行时加载 。
因为require是运行时加载,所以import命令没有办法代替require的动态加载功能 。
所以引入了import()函数 。完成动态加载 。
import(specifier)specifier用来指定所要加载的模块的位置 。import能接受什么参数,import()可以接受同样的参数 。
import()返回一个Promise对象 。
const main = document.querySelector('main');import(`./section-modules/${someVariable}.js`) .then(module => { module.loadPageInto(main); }) .catch(err => { main.textContent = err.message; });7.import()函数适用场合
1)按需加载:
button.addEventListener('click', event => { import('./dialogBox.js') .then(dialogBox => { dialogBox.open(); }) .catch(error => { /* Error handling */ })});above: import模块在事件监听函数中,只有用户点击了按钮,才会加载这个模块 。
2)条件加载:
import()可以放在if...else语句中,实现条件加载 。
if (condition) { import('moduleA').then(...);} else { import('moduleB').then(...);}



推荐阅读