• 【ES6】-- common.js与ES6模块化的差异


    目录

    ♡ ‧₊˚   语法区别 ‧₊˚ ♡

    ♡ ‧₊˚   加载时机 ‧₊˚ ♡ 

     ♡ ‧₊˚   引用差别 ‧₊˚ ♡

         ES6的导出方式


    common.js与ES6模块化的差异大致分为三点: 

    1. 两者的语法区别    
    2. commonjs在运行时候加载模块,ES6编译的时候加载模块;
    3. commonjs输出的是一个值的复制/深拷贝,ES6输出的是一个值的引用地址(重点)

    ♡ ‧₊˚   语法区别 ‧₊˚ ♡

    CommonJS 模块使用require()和module.exports,ES6 模块使用import和export。

     

    common.js中的导出模块:

    1. // commonjs模块化导出
    2. let firstName = 'Taylor';
    3. let lastName = 'Swift';
    4. // module表示当前模块对象
    5. console.log(module,'当前模块对象');
    6. module.exports={
    7. firstName,
    8. lastName
    9. }

     common.js中的导入模块:

    1. // commonjs模块化的导入 不需要转码 可以直接运行
    2. // 导入有export导出和默认导出的对象变量属性
    3. let {firstName, lastName} =require('./5-modules');
    4. console.log(firstName, lastName,'moduels6打印'); // Taylor Swift moduels6打印

     

    ES6中的导出模块:

    1. // 作为导出模块
    2. // ES6模块化导出
    3. let firstName = "zhao";
    4. let lastName = "ziyin";
    5. // 导出方式 列表导出
    6. export {firstName, lastName};

    ES6中的导入模块:

    1. // 导入模块
    2. // ES6模块化导入
    3. // 列表导入
    4. import {firstName, lastName} from './3-modules'
    5. console.log(firstName, lastName,'modules打印'); // zhaoziyin modules打印

    ♡ ‧₊˚   加载时机 ‧₊˚ ♡

     

    • 运行时加载:
    1. // commonjs模块化
    2. let {name, age, gender} = require('test01')
    3. // 相当于
    4. let _test01 = require('test01');
    5. let name = _test01.name;
    6. let age = _test01.age;
    7. let gender = _test01.gender;

    以上代码的实质是整体加载test01模块(即加载test01的所有方法),生成一个对象(_test01),然后再从这个对象上面读取 3 个方法。这种加载称为“运行时加载”,因为只有运行时才能得到这个对象,导致完全没办法在编译时做“静态优化”。 

     

    • 编译时加载/静态加载
    1. // ES6模块
    2. import { name, age, gender } from 'test01';

    这个代码的实质是从test01模块加载 3 个方法,其他方法不加载。这种加载称为“编译时加载”或者静态加载,即 ES6 可以在编译时就完成模块加载,效率要比 CommonJS 模块的加载方式高。当然,这也导致了没法引用 ES6 模块本身,因为它不是对象。

     ♡ ‧₊˚   引用差别 ‧₊˚ ♡

     

    • CommonJS 模块输出的是一个值的拷贝:
    1. // commonjs模块化导出
    2. // 运行时加载模块 输出的是一个值的复制
    3. let firstName = "good";
    4. let lastName = "morning";
    5. module.exports={
    6. firstName,
    7. lastName
    8. }
    9. setTimeout(()=>{
    10. lastName = "evening";
    11. },2000)
    12. // commonjs模块化导入
    13. let {firstName, lastName} = require('./7-modules');
    14. console.log(firstName, lastName); //good morning
    15. setTimeout(()=>{
    16. console.log(firstName, lastName); //good morning
    17. },4000)

    注意:CommonJS 模块输出的是值的拷贝,也就是说,一旦输出一个值,模块内部的变化就影响不到这个值。

     

    • ES6 模块输出的是值的引用:
    1. // es6模块化导出
    2. let firstName = "good";
    3. let lastName = "morning";
    4. export {firstName, lastName};
    5. setTimeout(()=>{
    6. lastName = "envening"
    7. },2000)
    8. // es6的模块化引入 ES6模块输出的是值的引用。
    9. import {firstName, lastName} from "./7-modules";
    10. console.log(firstName, lastName); //good morning
    11. setTimeout(()=>{
    12. console.log(firstName, lastName); //good envening
    13. },4000)

    注意:ES6 模块是动态引用,并且不会缓存值,模块里面的变量绑定其所在的模块,模块内部的变化会影响这个值。

    ES6的导出方式

    1. // 作为导出模块
    2. // ES6模块化导出
    3. let firstName = "zhao";
    4. let lastName = "ziyin";

    1.导出方式 列表导出

    export {firstName, lastName};

     2.重命名导出

    export {firstName as first, lastName as last}
    

    3.单个属性导出

    1. export let a = 1;
    2. export function get(){
    3.     console.log('modules3导出');
    4. };

     4.1默认导出

    1. export default {
    2.     firstName,lastName,
    3.     b:'默认导出'
    4. }

    4.2默认导出一个方法 

    1. export default function(){
    2.     console.log('hello默认导出一个方法');
    3. }

    注意: 一个模块只能有一个默认导出

  • 相关阅读:
    18. knife4j 接口文档
    [公派访问学者]申请方法分享
    SpringBoot中使用JdbcTemplate访问Oracle数据库
    AWS Lambda函数实战
    vue监听div的高度变化
    100天精通Andriod逆向——第1天:ADB原理及其常用命令
    GNN+RA 文献阅读
    windows php7.3安装rabbitmq扩展
    luffy-(5)
    MATLAB APP纯小白入门 两数相加
  • 原文地址:https://blog.csdn.net/qq_48802092/article/details/126835074