代码之家  ›  专栏  ›  技术社区  ›  cdarwin

从ES6导入命名空间为的旧JavaScript

  •  1
  • cdarwin  · 技术社区  · 7 年前

    我正在使用babel和webpack将旧的javascript转换为ES6。 在多个文件中,我有一些

    var BLOG = BLOG || {};
    BLOG.myClass1 = ...
    

    在另一个文件中

    var BLOG = BLOG || {};
    BLOG.myClass2 = ...
    

    所以,我补充说 export {BLOG} 到这些文件,但我如何可以多次导入博客?这似乎是不允许的,而我想做一些像

    import {BLOG} from 'file1.js'
    import {BLOG} from 'file2.js'
    

    把myclass1和myclass2放到博客里。

    有办法吗?

    2 回复  |  直到 7 年前
        1
  •  3
  •   T.J. Crowder    7 年前

    所以,我补充说 export {BLOG} 到这些文件,但是如何导入 BLOG 多次?

    您必须为它们使用不同的导入绑定:

    import {BLOG as BLOG1} from 'file1.js';
    import {BLOG as BLOG2} from 'file2.js';
    

    …然后使用 BLOG1 BLOG2 . 或者如果这让你不安,再加上

    const BLOG = Object.assign({}, BLOG1, BLOG2);
    

    进口后继续使用 博客 .

    如果 你有循环依赖,可能 博客1 博客2 可能不会立即完全填充。用真 import / export ,在这种情况下,您接收的对象将具有其属性,但这些属性不会 初始化 然而。如此真实 进口 / 出口 或者一个好的模拟,您可以使用访问器属性来处理它:

    // In a true ES2015+ module environment, or a simulated one that
    // creates the properties up-front like the real one does
    const BLOG = (() => {
        const b = {};
        for (const blog of [BLOG1, BLOG2]) {
            for (const key of Object.keys(blog)) {
                Object.defineProperty(b, key, {
                    get(name) {
                        return blog[name];
                    }
                });
            }
        }
        return b;
    })();
    

    (很明显,您将把它包装在一个函数中并重用它。)

    在模拟的模块环境中,如果没有像真实的那样预先创建属性,则可以使用代理(当然,如果要在ES2015之前的环境中运行该代理,则不会 Proxy ):

    const BLOGS = [BLOG1, BLOG2];
    const BLOG = new Proxy({}, {
      get(target, propName, receiver) {
        const b = BLOGS.find(b => propName in b) || target;
        return Reflect.get(b, propName, receiver);
      }
    });
    

    然后,属性添加到 博客1 博客2 在事实得到正确解决之后。

    所有这些都是 可怕的命运 只是为了避免接下来提到的搜索和替换。


    但是: 而不是导出 博客 , as SLaks says ,导出类,然后导入这些类。当您使用适当的模块时,不需要“名称空间对象”。

    export { myClass1 };
    

    export { myClass2 };
    

    然后

    import { myClass1 } from "file1.js";
    import { myClass2 } from "file2.js";
    

    甚至可以按定义导出类,或者:

    export function myClass1() { /* ... */ }
    

    或者如果使用 class 表示法:

    export class myClass1 { /* ... */ }
    

    改变 new BLOG.myClass1 new MyClass1 跨多个文件的搜索和替换非常简单。尼克斯,你可以扔 sed 在它上面做一个完整的目录树…


    边注: 势不可挡的 javascript中的约定是构造函数函数(通常松散地称为“类”,例如与一起使用的函数 new )以大写字母开头。例如。, MyClass1 MyClass2 .

        2
  •  0
  •   Code Maniac    7 年前

    您需要按以下方式使用import

    {BLOG as variable name} from file