2016-06-06 10 views
8

Próbuję opublikować w NPM bibliotekę komponentów wykonaną przy użyciu React.jaki jest właściwy sposób opublikowania modułu komponentu React w NPM bez zewnętrznych zależności wewnątrz?

Nie chcę, aby jego zewnętrzne zależności, a nawet moduły React, miały najmniejszy możliwy rozmiar pliku, a użytkownik doda te zależności w aplikacji.

Używam npm i webpack do zarządzania zależnościami.

  • To jest moje package.json zależności:

    "devDependencies": { 
        "webpack": "^1.13.1", 
        "webpack-dev-server": "^1.14.1", 
        "webpack-merge": "^0.13.0", 
        "babel-core": "^6.9.1", 
        "babel-loader": "^6.2.4", 
        "babel-preset-es2015": "^6.6.0", 
        "babel-preset-react": "^6.5.0", 
        "babel-preset-react-hmre": "^1.1.1", 
        "react": "^15.0.2", 
        "react-dom": "^15.0.2" 
        }, 
    "peerDependencies": { 
        "react": "^15.0.2", 
        "react-dom": "^15.0.2" 
    } 
    
  • W moim pliku webpack.config.js mam punktu wejścia jako 'component.jsx' i wyjścia jako pliku 'lib.js'

    // Source code entry 
    entry: { 
        lib: './src/components/component.jsx' 
    }, 
    
    // Code Output 
    output: { 
        path: PATHS.build, 
        filename: 'lib.js' 
    }, 
    
  • Zawarłem również atrybut "externals" z modułami reagowania, aby uniknąć pakietu internetowego zawierającego go w wynikach "lib.js".

    externals: { 
        'react': 'React', 
        'react-dom' : 'ReactDOM' 
    } 
    
  • Wreszcie jest to proste React składnik, który chcę rozpatrzenie:

    import React from 'react'; 
    
    export default class Component extends React.Component { 
    
        constructor() { 
        super(); 
        } 
    
        render() { 
        return (
         <h1>MY COMPONENT</h1> 
        ); 
        } 
    } 
    

opublikowałem go do KMP i zainstalowaniu go w innym projekcie. Kiedy próbowałem go używać po import React stwierdzenie, że daje mi powiedzenie o błędzie, które reagują nie jest zdefiniowana (bundle.js: 28448 Uncaught ReferenceError: React nie jest zdefiniowana)

  • Mój kod sondy komponent:

    import React from 'react'; 
    import ReactDOM from 'react-dom'; 
    import Component from 'component'; 
    import $ from 'jquery'; 
    
    ReactDOM.render(
        <Component />, 
        $("#app") 
    ); 
    

Am I brakuje czegoś w config zależności?

Dzięki

+0

co wersję KMP? –

Odpowiedz

4

Pakiet internetowy externals domyślnie jest ustawiony na libraryTarget. Oznacza to, że jeśli niczego nie określisz, wyprowadzi zewnętrzne jako var, i exepcts go jako zmienną globalną.

wyjście WebPACK stosując globalny:

/* 76 */ 
/***/ function(module, exports) { 

    module.exports = react; 

/***/ }, 

Musisz powiedzieć go szukać w zależności od zainstalowanych modułów (do require IT). w tym celu zmień swoje zewnętrzne na:

Wymagana zmiana (w pakiecie sieci Web.config):

externals: { 
    'react': 'commonjs react', 
    'react-dom' : 'commonjs react-dom' 
} 

I wtedy będzie to wyjście używając commonjs.

WebPACK wyjściowe przy użyciu commonjs:

/* 76 */ 
/***/ function(module, exports) { 

    module.exports = require('react'); 

/***/ }, 

odniesienia do webpack docs here.

Zauważ, że zmieniłem twoje zewnętrzne z powrotem na małe litery, ponieważ wartość powinna być nazwą zależności do wyszukania (w tym przypadku react i react-dom).

(Nawiasem mówiąc, jeśli nie chcesz, aby pakiet żadnego node_module, polecam korzystania webpack-node-externals)

+1

Wprowadziłem zmiany, które mi powiedziałeś, ale dostaję błąd na: module.exports = require ('react'); mówiąc: lib.js: 8166 Uncaught ReferenceError: require nie jest zdefiniowany – ldoc

+0

Tak, mam opcje zewnętrznych zmian dodając prefiks commonjs – ldoc

+0

Nie zdefiniowałem "library" i "libraryTarget" w konfiguracji "ouput", może to być problem? – ldoc

0

robicie plik wyjściowy jako lib.js ale podczas renderowania jesteś czytanie bundle.js. Zmień nazwę pliku wyjściowego na bundle.js lub dołącz lib.js do swojego index.html zamiast bundle.js.

+0

Niestety, nie wyjaśniam tego dobrze, bundle.js to skompilowany plik aplikacji, która zużywa moduł komponentu i nie ma tej samej nazwy. – ldoc

Powiązane problemy