Javascript:如何在全球范围内使用React组件?

时间:2020-02-18 01:33:39

标签: javascript reactjs webpack jsx

我已经制作了一个NPM软件包来进行响应,它在Node上可以正常工作,但是在没有node的浏览器上不能正常工作。

如果我这样导入节点:

import Progress from 'package-name'

// jsx
<Progress /> //working fine

一切正常。

但是,如果我像unpkg一样从CDN中使用它,它将无法正常工作。

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.4.2/react.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.4.2/react-dom.js"></script>

// Package Script
<script src="https://unpkg.com/@delowar/react-circle-progressbar@0.0.9/lib/Progress.js"></script>

<script>
    ...react code...
    <Progress />
    ...react code...
</script>

显示错误:

未定义进度

enter image description here 有人可以帮我解决这个问题吗?

Webpack配置:

var path = require('path');

module.exports = {
    mode: 'production',
    entry: './src/Progress.js',
    output: {
        path: path.resolve('lib'),
        filename: 'Progress.js',
        libraryTarget: 'umd',
        library: 'lib',
        umdNamedDefine: true,
        globalObject: `(typeof self !== 'undefined' ? self : this)`
    },
    module: {
        rules: [
            {
                test: /\.(js|jsx)$/,
                exclude: /(node_modules)/,
                use: 'babel-loader'
            }
        ]
    }
}

原始回购:https://github.com/delowardev/react-circle-progressbar

3 个答案:

答案 0 :(得分:3)

library的值更改为组件library: 'Progress'的名称,并添加libraryExport: 'default'以将默认导出分配给库目标:

output: {
  path: path.resolve('lib'),
  filename: 'Progress.js',
  library: 'Progress',
  libraryTarget: 'umd',
  libraryExport: 'default',
  umdNamedDefine: true,
  globalObject: `(typeof self !== 'undefined' ? self : this)`
},

工作示例

function App() {
  return (
    <Progress />
  )
}

ReactDOM.render( <App /> , document.getElementById('root'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.4.2/react.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.4.2/react-dom.js"></script>

<script src="https://rawcdn.githack.com/fraction01/react-circle-progressbar/0957fed54db16a3f7b9d625711ed3961f3b34371/lib/Progress.js"></script>
<div id="root"></div>

答案 1 :(得分:0)

您应按照docs中的说明将其配置为外部依赖项。
将此添加到您的webpack配置中:

externals : {
    Progress: 'progress'
}

用法:
import Progress from 'progress';

答案 2 :(得分:0)

您不能直接从URL要求或导入模块。

但是您可以像下面那样导入它。

// Package Script
<script src="https://unpkg.com/@delowar/react-circle-progressbar@0.0.9/lib/Progress.js"></script>

const Progress = window.Progress;