【问题标题】:Converting single file revealing module pattern javascript to multi-file using import使用导入将单个文件显示模块模式 javascript 转换为多文件
【发布时间】:2020-02-20 01:01:30
【问题描述】:

我是 JS 设计模式的新手,没有使用过很多 requireimport。我有一个包含多个函数和私有变量的模块,它被打包到一个模块中。目前所有内容都在一个文件中,但将其拆分为多个文件将是一种很好的做法,并且可以提供更好的清晰度。模块模式的简化视图如下所示:

let Module = () => {
  //some private variables
  let private1,
      private2;

  //some public functions
  function addDatatoPrivate1 (data) {
    private1 = processData(data);
  }

  function addDatatoPrivate2 (data) {
    private2 = processData(data);
  }

  //private function processData
  function processData(data) {
    return data.trim();
  }

  return {
    addDatatoPrivate1: addDatatoPrivate1,
    addDatatoPrivate2: addDatatoPrivate2,
  }
}

我想将函数拆分为多个文件,即 addDatatoPrivate1addDatatoPrivate2processData 的单独文件。此外,我希望变量 private1private2 可用于模块中的其他方法。如何将代码拆分为多个文件,然后如何使用import 将模块的不同组件打包成一个。

最终的目标是让用户可以加载到他们自己的项目中并使用 d3js 或 jQuery 之类的东西。例如,使用上面的代码,任何人都可以简单地将模块分配给一个变量并像这样使用它:

  let moduleInstance = Module();
  moduleInstance.addDatatoPrivate1(' some data here ');
  moduleInstance.addDatatoPrivate2(' some data here2 ');

【问题讨论】:

    标签: javascript design-patterns import revealing-module-pattern


    【解决方案1】:

    你可以使用ES6 modules

    步骤:

    1. 创建模块文件,假设文件名为“someModule.js”并在其中添加您的代码并使用ES6export 导出方法。
       //some private variables
        let private1,
            private2;
    
        //some public functions
        function addDatatoPrivate1 (data) {
          private1 = processData(data);
        }
    
        function addDatatoPrivate2 (data) {
          private2 = processData(data);
        }
    
        //private function processData
        function processData(data) {
          return data.trim();
        }
    
        return {
          addDatatoPrivate1: addDatatoPrivate1,
          addDatatoPrivate2: addDatatoPrivate2,
        }
    
        export {
            processData,
            addDatatoPrivate1,
            addDatatoPrivate2,
        }
    
    

    现在模块的用户可以像下面这样导入模块了。

    使用ES6对象解构

     import {addDatatoPrivate1, addDatatoPrivate2, processData} from './someModule'
    
      addDatatoPrivate1(' some data here ');
      addDatatoPrivate2(' some data here2 ');
    

    或使用通配符 (*)

    import * as moduleInstance from './someModule'
    
    moduleInstance.addDatatoPrivate1(' some data here ');
    moduleInstance.addDatatoPrivate2(' some data here2 ');
    

    不能私下导出变量。默认情况下,从模块导出的任何内容都是公开的。

    如果您想为每个模块创建单独的模块,则可以执行以下操作。

    我们可以使用ES6 默认导出来避免对象解构。

    module1.js

    
     function processData(data) {
        return data.trim();
     }
    
    
     export default processData;
    

    module2.js

     import processData from './module1';
     //some private variables
     let private1;
    
    //some public functions
    function addDatatoPrivate1 (data) {
        private1 = processData(data);
    }
    
    export default addDatatoPrivate1;
    

    module3.js

    import processData from './module1';
    
    //some private variables
    let private2;
    
    
    function addDatatoPrivate2 (data) {
        private2 = processData(data);
    }
    
    export default addDatatoPrivate2;
    

    然后你可以包含这些模块和其他一些文件。

    import addDatatoPrivate1 from './module2';
    import addDatatoPrivate2 from './module3';
    
    addDatatoPrivate1(' some data here ');
    addDatatoPrivate2(' some data here2 ');
    

    或者您可以将所有方法导出到一个文件中,以便其他人可以导入并使用。

    index.js

    import addDatatoPrivate1 from './module2';
    import addDatatoPrivate2 from './module3';
    
    export {
       addDatatoPrivate1,
       addDatatoPrivate2
    }
    

    【讨论】:

    • 感谢您的回答。如果我必须将这两个函数放在单独的文件中,我如何将它导入到一个主模块文件中?关键是将 somemodule 作为单独的文件。
    • 感谢这有帮助,但最后一部分如何将所有功能打包到一个包中以便像 jquery 或 d3js 那样导出?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    • 2020-06-26
    相关资源
    最近更新 更多