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

如何导出全局工作的模块以及ES6导入

  •  2
  • nanobar  · 技术社区  · 6 年前

    目前我的导出方式如下:

    module.exports = ReactCrop;
    module.exports.getPixelCrop = getPixelCrop;
    module.exports.makeAspectCrop = makeAspectCrop;
    module.exports.containCrop = containCrop;
    

    基本上是获取一个类(函数)并向其中添加非默认的导出。

    ReactCrop . 这意味着当它通过 <script> window.ReactCrop

    但是,如果我将其更改为ES6:

    export {
      ReactCrop,
      ReactCrop as default,
      getPixelCrop,
      makeAspectCrop,
      containCrop,
    };
    

    eslint

    import * as ReactCrop from...
    

    要让babel将其转换为一个对象,就其现状而言,这是行不通的:

    import { getPixelCrop } from... 
    

    window.ReactCrop
    {ReactCrop: ƒ, default: ƒ, getPixelCrop: ƒ, makeAspectCrop: ƒ, __esModule: true}
    

    i、 e.用户必须 window.ReactCrop.ReactCrop 访问类。

    问题: 我怎样才能满足这两种情况,使它在全局上仍然是一个函数,因为 窗口.ReactCrop.ReactCrop { partialImports } 让eslint和typescript高兴地找到一个默认导出的对象?

    output: {
      path: path.resolve('dist'),
      library: 'ReactCrop',
      libraryTarget: 'umd',
      filename: minified ? 'ReactCrop.min.js' : 'ReactCrop.js',
    }
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   Bergi    6 年前

    我怎样才能满足这两种情况,使它在全局上仍然是一个函数

    如果使用命名空间导入,则不可能这样做。命名空间对象永远不是函数。

    但是你可以这样做

    import ReactCrop, * as ReactCropNs from "…";
    Object.assign(ReactCrop, ReactCropNs);
    window.ReactCrop = ReactCrop;
    

    如果你想让它以这种形式在全球范围内可用。我不认为有一个网页包选项,这样做自动作为一个全球性的出口。

    因为 window.ReactCrop.ReactCrop

    你可以用 window.ReactCrop.default 相反。