NODE02-Javascript模块化编程

2019-10-23  本文已影响0人  杨强AT南京

  模块化编程是每个语言都有的,因为Javascript早期的目的与版本的发展,Javascript的模块化编程相对来说比较混乱,尤其早期require/module.exports与后来向Java标准靠拢引入的import与export语法,则ES6以后显得混乱;但总的趋势还是标准化吧,只是这个时间估计还要混乱很久;等标准化后,本主题相关的内容就是过往云烟了。本主题的主要内容:
  1. require与module.exports;
  2. import与export;
  3. Node.js与ES6的语法;


  实际前端技术中的框架都是因这个灾难而起,babel, webpack,poi都与这个有关系(当然更主要的目的是把Javascript的开发技术都统一成一样的编写方式,而不是差异化的)


关于模块化

require的使用

模块的定义

module对象

Module {
  id: '.',
  exports: {},
  parent: null,
  filename: '/Users/yangqiang/Documents/09Web/study/nod_demo/n04_module_03call.js',
  loaded: false,
  children: [],
  paths: 
   [ '/Users/yangqiang/Documents/09Web/study/nod_demo/node_modules',
     '/Users/yangqiang/Documents/09Web/study/node_modules',
     '/Users/yangqiang/Documents/09Web/node_modules',
     '/Users/yangqiang/Documents/node_modules',
     '/Users/yangqiang/node_modules',
     '/Users/node_modules',
     '/node_modules' ] }

module.exports与require

导出的例子


    var v_a = "导出的变量";  

    function mod_func(){
        console.log("导出的函数");
    }

    function cls_a(){
        this.m_a = 20;
        this.func = function(){
            console.log("成员函数!");
        }
    }

    var obj_a = new cls_a();

    module.exports = {
        o_1 : v_a,
        o_2 : mod_func,
        o_3 : cls_a,
        o_4 : obj_a
    }

加载导出的例子


    var m = require("./n04_module_01exports");

    console.log(m.o_1);  // 输出1
    m.o_2();   // 输出2

    var m_o = new m.o_3();
    console.log(m_o.m_a);   // 输出3
    m_o.func();

    console.log(m.o_4.m_a);  // 输出4
    m.o_4.func();

exports字典的另外一种方式


    var v_a = "导出的变量";  

    function mod_func(){
        console.log("导出的函数");
    }

    function cls_a(){
        this.m_a = 20;
        this.func = function(){
            console.log("成员函数!");
        }
    }

    var obj_a = new cls_a();
    // 需要引号
    module.exports["o_1"] = v_a;
    module.exports["o_2"] = mod_func;
    module.exports["o_3"] = cls_a;
    module.exports["o_4"] = obj_a;

module.exports中需要注意的情况

  1. exportsda单绑定
    const EventEmitter = require('events');

    module.exports = new EventEmitter();     // 单绑定

    // 处理一些工作,并在一段时间后从模块自身触发 'ready' 事件。
    setTimeout(() => {
      module.exports.emit('ready');          // 直接使用exports调用。
    }, 1000);
  1. 绑定必须在加载的时候,不能再运行的时候
    • 不能在回调函数中绑定
    setTimeout(() => {
      module.exports = { a: 'hello' };
    }, 0);

全局变量exports

    var v_a = "导出的变量";  

    function mod_func(){
        console.log("导出的函数");
    }

    function cls_a(){
        this.m_a = 20;
        this.func = function(){
            console.log("成员函数!");
        }
    }

    var obj_a = new cls_a();
    exports["o_1"] = v_a;
    exports["o_2"] = mod_func;
    exports["o_3"] = cls_a;
    exports["o_4"] = obj_a;

import的使用

import语句

ImportDeclaration:
    import   ImportClause   FromClause;
    import   ModuleSpecifier;

export语句

    export ExportFromClause FromClause;
    export NamedExports;
    export VariableStatement[~Yield, ~Await]
    export Declaration[~Yield, ~Await]
    export default HoistableDeclaration[~Yield, ~Await, +Default]
    export default ClassDeclaration[~Yield, ~Await, +Default]

模块的定义

    var v_a = "导出的变量";  

    function mod_func(){
        console.log("导出的函数");
    }

    function cls_a(){
        this.m_a = 20;
        this.func = function(){
            console.log("成员函数!");
        }
    }

    var obj_a = new cls_a();

    export default {
        mod_func,
        v_a,
        mod_cls:cls_a,
        mod_obj:obj_a
    }

    // 测试环境下不支持
    // export default{
    //     cls_a as mod_cls,
    //     obj_a as mod_obj
    // }

模块的使用

    import mod from "./n05_module_01export"

    console.log(mod.v_a);
    mod.mod_func();
    mod.mod_obj.func();

Node.js对ES6的支持

NodeJs兼容ES6的模块化语法

babel-register

babel-register的安装

babel-register使用的例子

  1. 文件1:export
    var v_a = "导出的变量";  

    function mod_func(){
        console.log("导出的函数");
    }

    function cls_a(){
        this.m_a = 20;
        this.func = function(){
            console.log("成员函数!");
        }
    }

    var obj_a = new cls_a();

    export default {
        mod_func,
        v_a,
        mod_cls:cls_a,
        mod_obj:obj_a
    }

    // 测试环境下不支持
    // export default{
    //     cls_a as mod_cls,
    //     obj_a as mod_obj
    // }

  1. 文件2:import
    import mod from "./n06_module_01export"

    console.log(mod.v_a);
    mod.mod_func();
    mod.mod_obj.func();

  1. 文件3:使用label-register封装翻译
    require('babel-register') ({
        presets: [ 'env' ]
    })
    module.exports = require('./n06_module_02import');

babel-node


上一篇下一篇

猜你喜欢

热点阅读