2015-08-05 13 views
13

ich ein Modul mit es6 und veröffentlichen zum npm schrieb, ich will es in einem anderen Projekt verwenden, so tippe ich wie folgt aus:importieren ein Modul aus node_modules mit babel aber nicht

import {ActionButton} from 'rcomponents' 

Aber es didn‘ t Arbeit:

D:\github\blog\node_modules\rcomponents\src\actionButton.jsx:1 
(function (exports, require, module, __filename, __dirname) { import React fro 
                   ^^^^^^ 
SyntaxError: Unexpected reserved word 
    at exports.runInThisContext (vm.js:73:16) 
    at Module._compile (module.js:443:25) 
    at Module._extensions..js (module.js:478:10) 
    at Object.require.extensions.(anonymous function) [as .jsx] (D:\github\blog\ 
node_modules\babel\node_modules\babel-core\lib\api\register\node.js:214:7) 
    at Module.load (module.js:355:32) 
    at Function.Module._load (module.js:310:12) 
    at Module.require (module.js:365:17) 
    at require (module.js:384:17) 
    at D:\github\blog\node_modules\rcomponents\src\index.js:3:19 
    at Object.<anonymous> (D:\github\blog\node_modules\rcomponents\src\index.js: 
7:3) 

Hier ist meine js Loader-Konfiguration in webpack:

{ test: /\.jsx?$/, loader: `babel?cacheDirectory=${babelCache}` } 

Wenn ich versuche, ein Modul zu importieren, die nicht f Von node_modules funktioniert Babel gut. Aber importieren Sie ein Modul von node_modules, scheint Babel nicht zu funktionieren?

Antwort

15

Siehe the babel docs:

HINWEIS: Standardmäßig werden alle erfordert node_modules werden ignoriert. Sie können dies überschreiben, indem Sie einen Ignore-Regex übergeben.

Im Allgemeinen ist die Erwartung, dass die Module in node_modules werden bereits vor der Zeit transpiled worden, so dass sie nicht von Babel verarbeitet. Wenn Sie das nicht tun, müssen Sie ihm mitteilen, welche Dateien er verarbeiten kann. ignore ermöglicht das.

+1

Falls Sie den gleichen Ansatz mit babel-Knoten verwenden möchten Sie tun können, 'babel- node --ignore '/ node_modules/(?! my_module1 | my_module2)' script.js' – cuadraman

+6

Dies ist keine passende Antwort für Babel 6, ich bin in eine ähnliche Situation gerannt und finde keine Möglichkeit, Module zu transponieren ein Knotenmodul. Nur als Ergänzung zu denen, die immer noch nach einer Lösung in Babel 6 suchen. – BTC

+0

Ich stimme zu, ich bin nicht in der Lage, node_modules Modul mit babel 6 – Alphapage

3

Im Allgemeinen sollten Pakete, die auf npm hochgeladen werden, vorkompiliert werden, sodass Benutzer normalen JS erhalten und keinen Build-Schritt benötigen. Verwenden Sie hierzu npm prepublish.

Wenn Sie jedoch webpack verwenden, können Sie eine exclude Funktion in Ihrem webpack Konfiguration angeben (siehe webpack docs):

module: { 
    loaders: [{ 
    test: /.jsx?$/, 
    loader: 'babel-loader', 
    exclude(file) { 
     if (file.startsWith(__dirname + '/node_modules/this-package-is-es6')) { 
     return false; 
     } 
     return file.startsWith(__dirname + '/node_modules'); 
    }, 

Wenn Sie babel verwenden direkt, you can write a similar ignore function in the require hook.

1

können Sie https://www.npmjs.com/package/babel-node-modules verwenden für diesen Fall

npm install --save-dev babel-node-modules 
require('babel-node-modules')([ 
    'helloworld' // add an array of module names here 
]); 

und dann kompiliert es aufgeführten Module als andere Dateien

Verwandte Themen