【问题标题】:Fine Uploader with Webpack & ES6带有 Webpack 和 ES6 的精细上传器
【发布时间】:2016-03-23 18:04:36
【问题描述】:

我正在尝试将 Fine-uploader 与通过 Webpack 捆绑的 React/ES6 应用程序集成。寻找有关如何在此堆栈中包含精细上传器的指导。

在我的webpack.config.js 中,我为 Fine Uploader 设置了一个别名,如下所示:

resolve: {
    alias: {
      'fine-uploader': path.resolve('node_modules/fine-uploader/s3.fine-uploader')
    }
}

在我的 React 组件中,我有以下内容:

import React from 'react'

import 'fine-uploader'

export default () => {
  return <h1>Fine Uploader</h1>
}

Webpack 对我咆哮:

Module not found: Error: Cannot resolve 'file' or 'directory' /Users/mfeltner/code/yden/foo/node_modules/fine-uploader/s3.fine-uploader in /Users/mfeltner/code/yden/foo/static/common/containers/fine-uploader
 @ ./static/common/containers/fine-uploader/fine-uploader.jsx 11:20-44

我相当确定我需要以某种方式填充精细上传器 javascript,因为它通过将自身附加到 window.qq 来表现老派的方式,我想这与模块加载器不兼容。

【问题讨论】:

标签: reactjs ecmascript-6 webpack fine-uploader


【解决方案1】:

想通了!

首先,我必须为 webpack 安装 exports-loader。此加载程序将填充非 CommonJS/UMD/AMD 捆绑包,以便您可以requireimport 它们 (read more here)。然后我必须编辑我的 webpack.config.js 以填充 qq 命名空间,以适应我正在使用的 Fine Uploader 类型(在本例中为 S3):

webpack.config.js

module: {
    loaders: [
        {
            test: /s3\.fine-uploader\.js/,
            loader: 'exports?qq'
        }
    ]
}

现在我可以从 Fine Uploader 中 import qq 对象并像往常一样访问它,只是它不在全局命名空间中。赢了!

请注意,我必须在 React 渲染的 DOM 元素中包含一个 ref,以便 Fine Uploader 知道将自己附加到哪里。另外,注意使用componentDidMount 来确保元素已经被React渲染。

fine-uploader.jsx

import React from 'react'

import qq from 'fine-uploader/s3.fine-uploader'

class FU extends React.Component {
  constructor (props) {
    super(props)
  }

  componentDidMount () {
    const fu = new qq.s3.FineUploaderBasic({
      button: this.refs.fu
    })
  }

  render () {
    return <div ref='fu'>Upload!</div>
  }
}

export default FU

当我尝试将此库与 React 和现代 Javascript 生态系统集成时,我可能会有更多问题。

【讨论】:

  • 这似乎对我不起作用,你能扩展你的答案吗?我仍然没有在我的模块中找到 qq 变量。不,那是谎言。我找到了 qq 变量,但它只是一个空对象。qq.s3 is undefined
  • 指定文件名也对我有用import qq from 'fine-uploader/fine-uploader/fine-uploader.js'。我花了更长的时间才承认弄清楚这一点......
  • @Pascal 也许如果你打开一个新问题并分享你的代码,我可以看看,否则我只是猜测。
  • 是的,目前确实是import qq from 'fine-uploader/s3.fine-uploader/s3.fine-uploader.js'import qq from 'fine-uploader/all.fine-uploader/all.fine-uploader.js' 之类的变体之一。这是因为它是一个未正确打包的 npm 发行版(没有包含 package.json 或名为 index.js 的入口文件)。目前使用5.7.1Node 5.9.xwebpack 1.13.0exports-loader 0.6.3
  • @VictoriaFrench 你是对的,Fine Uploader 最初是在 CommonJS 存在多年前制作的(JS 的黑暗时期),我们必须解决这个问题。很抱歉给您带来不便。我不确定你们都在做什么不同,因为我不必指定文件名。你确定你有一个 webpack 别名设置(见我最初的问题)?
【解决方案2】:

刚刚更新到 NPM 版本 5.9.0,可以看到它们现在导出模块。这意味着您可以将其导入到您的组件中,而无需使用 webpack 中的导出加载器。

import qq from 'fine-uploader/fine-uploader/fine-uploader.js';

也适用于

import qq from 'fine-uploader/lib/traditional';

供 s3 加载器使用

import qq from 'fine-uploader/lib/s3';

【讨论】:

  • 您可以更轻松地导入传统库:import qq from 'fine-uploader'。文档在 the imports feature page 中涵盖了所有这些以及更多内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多