2017-03-04 4 views
0

Ich habe eine React-Hauptanwendung und ich erstelle Webpack gebündelte React-Bibliotheken, die dynamisch in der Hauptanwendung auf Benutzeranforderung oder als Ergebnis einiger Benutzeraktionen geladen werden können.Wie lädt man ein Webpack React Bundle mit SystemJS?

Ich dachte, mit SystemJS dynamisch laden die Bibliotheken war der Weg zu gehen, aber ich kann keine Hinweise zu dem Thema finden.

Hier ist mein Problem:

Wenn ich die Bibliothek mit Reagieren Abhängigkeiten bündeln, ich die Datei mit SystemJS laden kann, aber ich diesen Fehler:

invariant.js:44 Uncaught (in promise) Error: addComponentAsRefTo(...): Only a ReactOwner can have refs. You might be adding a ref to a component that was not created inside a component's render method, or you have multiple copies of React loaded

Dies macht Sinn, da als Reaktion in meinem Bundle enthalten und ist auch Teil der Haupt-App. Also dachte ich, dass das Ausschließen von React aus der lib das Problem lösen wird. Ich fügte hinzu, die „externe“ zu meinen webpack config:

/////////////////////////////////////////////////////////// 
// Webpack config development 
// 
/////////////////////////////////////////////////////////// 
module.exports = { 

    devtool: 'source-map', 

    context: path.join(
    __dirname, '../src/Extensions'), 

    entry: { 
    Extension: [ 
     './Extension/index.js' 
    ] 
    }, 

    output: { 
    path: path.resolve(__dirname, '../dist'), 
    filename: "[name].js", 
    libraryTarget: "umd", 
    library: "[name]" 
    }, 

    plugins: [ 

    new webpack.HotModuleReplacementPlugin(), 

    new webpack.DefinePlugin({ 
     'process.env': { 
     NODE_ENV: JSON.stringify('development'), 
     WEBPACK: true 
     } 
    }), 

    new webpack.ProvidePlugin({ 
     'window.jQuery': 'jquery', 
     jQuery: 'jquery', 
     _: 'lodash', 
     $: 'jquery', 

     React: "React", 
     react: "React", 
     "window.react": "React", 
     "window.React": "React" 
    }), 

    new ProgressBarPlugin({ 
     format: ' build [:bar] ' + chalk.green.bold(':percent') + ' (:elapsed seconds)', 
     clear: false 
    }) 
    ], 

    resolve: { 
    modules: [ 
     path.resolve('./node_modules'), 
    ], 
    extensions : ['.js', '.jsx', '.json'] 
    }, 

    resolveLoader: { 
    modules: ['node_modules'] 
    }, 

    module: { 

    rules: [ 

     { 
     test: /\.jsx?$/, 
     exclude: /node_modules/, 
     use: [{ 
      loader: 'babel-loader', 
      options: { 
      presets: ['react', 'es2015', 'stage-0'], 
      plugins: ['transform-runtime'] 
      } 
     }] 
     } 
    ] 
    }, 

    externals: { 
    "react": "React", 
    "react-dom": "ReactDOM" 
    } 
} 

Aber nach so tun, das Laden der lib mit SystemJS ausgibt der folgende Fehler:

ConfiguratorView.js:116 Uncaught (in promise) Error: (SystemJS) Unexpected token < SyntaxError: Unexpected token < at eval() Evaluating http://localhost:3000/React Error loading http://localhost:3000/Extension.js at eval()

Ich verstehe SystemJS zu laden versucht, das Reagieren Abhängigkeit bei localhost: 3000/Reagieren und von was ich gelesen habe, muss dies mit SystemJS.config ({...}) konfiguriert werden, aber die Frage ist wie ?? Ich habe die SystemJS-Konfigurationsdokumentation gelesen, aber ich habe kein ähnliches Beispiel gesehen.

Bin ich der Einzige, der versucht, eine React-Bibliothek dynamisch zu laden? Gibt es einen besseren Ansatz? Ich möchte einen flexiblen Mechanismus haben, so dass unnötige Bibliotheken bei Bedarf geladen werden können und das Hauptpaket nicht aufblähen.

Danke für jeden Zeiger auf diesem

Antwort

0

Verwenden Sie ein debundler oder webpack als browserify Plugin die Paketnamen und Standorte zu den SystemJS Konfigurationsdateien zur Karte:

SystemJS is meant to work with any module definition specifications, and even a repository URL. This means when SystemJS encounters a require('module_name') or an import module_name, it doesn't know where to find the module called module_name. Would it be on npm? Or is it a custom repository? SystemJS can't know for sure.

So we'd need to provide a mapping of all packages' names and the location of their repository. Needless to say, doing this manually is impractical, so we must use another package manager, that manages packages from everywhere.

Referenzen

Verwandte Themen