2016-12-12 56 views
6

Pracuję nad dwoma pakietami węzła naraz, nazwijmy je Biblioteką i Konsumentem. Biblioteka jest odpowiedzialna za renderowanie wielu rzeczy w przeglądarce. Wszystko, co robi Konsument to import Library from 'library' i zadzwoń pod numer Library(someConfigHere) - to po prostu test, aby upewnić się, że biblioteka robi to, czego oczekuję w przeglądarce.Wymuś przeglądanie, aby przekształcić zależności?

Mam npm link ed Biblioteka w Consumer i próbuję uruchomić Browserify na Consumer, ale pojawia się ten błąd: ParseError: 'import' and 'export' may appear only with 'sourceType: module'. Biblioteka rzeczywiście zawiera oświadczenie ES6 export, więc domyślam się, że Browserify działa tylko przeciwko Konsumentowi, a nie Bibliotece.

Moje pytanie brzmi: czy istnieje sposób na zmuszenie Browserify do transformacji zależności również?

To jest mój package.json:

{ 
    "name": "consumer", 
    "version": "1.0.0", 
    "description": "", 
    "main": "index.js", 
    "scripts": { 
    "start": "budo index.js --port $PORT", 
    "test": "echo \"Error: no test specified\" && exit 1" 
    }, 
    "author": "", 
    "license": "ISC", 
    "devDependencies": { 
    "babel-preset-es2015": "^6.13.2", 
    "babel-preset-react": "^6.11.1", 
    "babelify": "^7.3.0", 
    "browserify-shim": "^3.8.12" 
    }, 
    "browserify": { 
    "transform": [ 
     "babelify" 
    ] 
    }, 
    "babel": { 
    "presets": [ 
     "es2015", 
     "react" 
    ] 
    } 
} 

To Konsumenta index.js:

import Library from 'library' // <= this is what isn't getting babelified 

console.log(Library); 

To Biblioteki index.js:

export default (config) => { 
    console.log('Testing testing') 
} 
+0

Jak wygląda twój plik 'tsconfig.json'? Takie "ParseError" sprawia, że ​​brzmi to tak, jakby kompilator TS nie przeszedł przez ten plik. –

+0

@DaveV Nie jestem pewien, co to jest kompilator TS. AFAIK 'ParseError' jest rzeczą Babel. – Rob

Odpowiedz

4

Browserify transformacje mogą być skonfigurowane tak, aby być globalny, który oznacza, że ​​będą one ap również do plików z zakresu node_modules.

Konfiguracja dotyczy transformacji. Z babelify, można skonfigurować go tak:

browserify().transform("babelify", { 
    global: true 
}) 

Lub, jeśli są za pomocą wiersza polecenia, na przykład:

browserify ... -t [ babelify --global ] ... 

Lub, aby skonfigurować go w package.json, to powinny być mniej więcej tak (uwaga dodanych w nawiasach kwadratowych):

"browserify": { 
    "transform": [ 
    ["babelify", { "global": true }] 
    ] 
} 

Babelify implementuje również opcję ignore, więc można ją skonfigurować tak, aby przekształcać tylko te pliki w obrębie node_modules, które mają być dostępne. Jest więcej informacji here.

Innym rozwiązaniem byłoby włączenie podobną konfigurację browserify/babelify w module za librarypackage.json. Podczas przetwarzania zależności program Browserify sprawdzi pliki zależności wymienionej zależności od siebie i zastosuje wszystkie skonfigurowane.

+0

To brzmi jak rozwiązanie, ale może się zdarzyć, aby wiedzieć, jak wyrazić to w sekcji 'browserify' pakietu' package.json'? – Rob

+1

Otrzymuję błąd "nieoczekiwanego tokena", gdy trafi on 'global: true'. Próbowałem owijać go podwójnymi cudzysłowami, które wyciszają ten błąd, ale nadal daje oryginalny "ParserError". Wygląda na to, że babelify nie honoruje tego ustawienia. – Rob

+0

Babelify powinno używać ustawienia; Jestem prawie pewien, że użyłem go w przeszłości. Jest możliwe/prawdopodobne, że funkcja browserify ignoruje ustawienie 'global', gdy jest używane w pliku' package.json'. W rzeczywistości, myśląc o tym, to prawdopodobnie to, co się dzieje (musiałbym sprawdzić źródło, aby potwierdzić). Inną opcją byłoby włączenie podobnego ustawienia 'browserify' w' package.json' modułu, którego używasz - wtedy ustawienie 'global' nie byłoby wymagane. – cartant