ES6破坏和模块导入
ES6 Destructuring and Module imports
我的印象是这种语法:
import Router from 'react-router';
var {Link} = Router;
最终结果与此相同:
import {Link} from 'react-router';
有人能解释一下有什么区别吗?
(我最初以为这是React路由器错误。)
import {Link} from 'react-router';
从react-router
导入命名导出,即类似的内容
export const Link = 42;
import Router from 'react-router';
const {Link} = Router;
从默认导出中提取属性Link
,假设它是一个对象,例如
export default {
Link: 42
};
(默认导出实际上只是一个名为"default"的标准化命名导出)。
另请参阅MDN上的export
。
完整示例:
// react-router.js
export const Link = 42;
export default {
Link: 21,
};
// something.js
import {Link} from './react-router';
import Router from './react-router';
const {Link: Link2} = Router;
console.log(Link); // 42
console.log(Link2); // 21
对于Babel 5和更低版本,我相信它们是可以互换的,因为ES6模块被转换到CommonJS的方式。但就语言而言,这是两种不同的结构。
要做到这一点:
import {purple, grey} from 'themeColors';
不为每个符号重复export const
,只需执行:
export const
purple = '#BADA55',
grey = '#l0l',
gray = grey,
default = 'this line actually causes an error';
除了不同的导出,它还可能导致当使用两种不同的方式来破坏ESM模块时,WebPack的不同捆绑代码:
// react-router
export function Link(str) { /* ... */ }
在
import
语句中进行破坏:import {Link} from 'react-router'; Link('1'); Link('2');
// WebPack output var util_mobileValidator__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(1); (0,util_mobileValidator__WEBPACK_IMPORTED_MODULE_3__.Link)('1'); (0,util_mobileValidator__WEBPACK_IMPORTED_MODULE_3__.Link)('2');
使用析构函数语法:
import * as Router from 'react-router'; const {Link} = Router; Link('1'); Link('2');
// WebPack output: var util_mobileValidator__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(1); const {Link} = util_mobileValidator__WEBPACK_IMPORTED_MODULE_3__; Link(1); Link(2);
正如您在上面的输出示例中看到的那样,其中存在冗余代码,当尝试通过UglifyJS
或Terser
进行uglify时,这不利于优化。
相关文章:
- ES6 (ECMAScript 2015) 模块:导入索引.js
- 如何使用 webpack 要求或仅从模块导入必要的导出
- 将字段从自定义模块导入Odoo(V9)POS模块
- ES6模块导入和依赖关系管理
- 将MQTT NPM模块导入NativeScript
- Typescript:从CommonJS模块导入默认值,从打字文件导出附加类型
- 无法从模块导入函数
- 将模块导入命名空间类
- JavaScript 将一个模块“导入”到另一个模块中
- 当未定义默认导出时,从“模块”导入模块是什么,为什么它与将 * 导入为模块不同
- 避免在ES6 JavaScript web项目中进行深度嵌套模块导入
- 将共享/部分模块导入另一个文件
- 从ES6模块导入到遗留js代码
- ES6破坏和模块导入
- RequireJS:不能将任何模块导入到特定的模块
- 如何使用Jest模拟ES6模块导入?
- 将Angular JavaScript模块导入TypeScript
- 将现有AMD模块导入ES6模块
- 用rollupjs、es2015模块导入
- 从不同的模块导入函数