2017-02-16 2 views
2

J'essaye d'ajuster mon application angulaire pour être prêt pour la compilation AOT et Tree Shaking (rollup). Mais j'ai des problèmes en utilisant des modules qui n'ont pas d'export par défaut (immutable.js, moment.js, ...). Selon typscript (look here), il est seulement possible d'utiliser de tels modules avec l'instruction suivante: import x = require('x') ou import * as x from 'x' Mais les deux instructions causent des problèmes lors du rollup. Dans certains cas, je reçois une erreur au cours de la Rollup: Cannot call a namespace ('x') et dans certains cas, je reçois une erreur d'exécution qui: x is undefinedAngular AOT/Rollup avec des modules qui n'ont pas d'exportation par défaut (comme immutable.js, moment.js)

Ici vous trouvez mes Rollup-config.js et TSconfig-aot.json tsconfig-aot_rollup-config.zip

I besoin d'un moyen d'utiliser des paquets comme immutable.js, moment.js pendant la compilation AOT et le rollup. Y a-t-il un moyen de faire cela?

Merci!

Répondre

4

MISE À JOUR

J'ai rencontré un problème avec ma réponse précédente. Voici la solution que j'ai trouvée qui fonctionne à la fois dans SystemJs et en utilisant AoT/rollup.

Ma déclaration d'importation est la suivante:

import * as moment from 'moment'; 
const momentJs = (moment as any).default ? (moment as any).default : moment; 

puis, dans votre code, l'utiliser comme ceci:

const startDateString = momentJs(startDate).format('YYYY-MM-DD'); 

Cela est dû à SystemJs et Rollup en utilisant deux méthodes différentes pour résoudre l'importation modules qui n'ont pas une exportation par défaut.

J'ai deux fichiers de configuration de typeScript, un pour systemJs, et un pour exécuter la construction AoT.Les deux ont ce jeu de drapeau dans compilerOptions

"allowSyntheticDefaultImports": true 

(réponse précédente)

Je suis tombé sur cette question précise. J'ai pu le faire fonctionner avec les éléments suivants:

var moment = require('moment'); //works 

par opposition à

import moment from "moment"; // won't work 

ou

import moment = require('moment'); //won't work 

dans ma config Rollup, j'ai aussi:

commonjs({ 
     include: [ 
      'node_modules/rxjs/**', 
      'node_modules/moment/**', 
      'node_modules/hammerjs/**' 
     ] 
    }), 

La chose qui m'a pointé dans le bon direc tion était this SO answer à une question similaire.

La solution ci-dessus fonctionne avec SystemJs et le processus AoT/Rollup pour Angular. Cela fait un peu de hack-ish car ce n'est pas la manière dactylographiée «typique» d'importer des modules, mais cela m'a permis de contourner le problème.

+0

Merci beaucoup, votre approche fonctionne! –

+0

Mise à jour a fonctionné très bien pour moi, merci! –

+0

Cela a fonctionné pour moi aussi (mise à jour de la réponse). Merci un million! –

0

Le cumul ne fonctionne qu'avec es6. Essayez de changer la cible dans votre TSconfig:

"target": "es6" 

Quand Rollup se terminera, vous pouvez compiler le paquet avec tapuscrit à ES5, avec l'option allowJs: true.

p.s. require est un Webpack-way, avec Rollup utilise la syntaxe d'importation es6.

+0

Votre approche ne fonctionne pas. J'essaie ce qui suit: - tsconfig-aot.json: mettre à jour la cible à ES6 - lancer la transpilation: 'ngc -p tsconfig-aot.json' - terminé avec succès - lancer le rollup:' rollup -c rollup- config.js' - terminé avec l'erreur suivante: '? Impossible d'appeler un espace de nom ('moment') ' Dans le code, j'importe un moment avec cette instruction:' import * comme moment de "moment"; ' Y at-il un problème? Merci! –

+0

ngc ne compile pas votre tapuscrit. Vous devriez mettre à jour non tsconfig-aot.json, mais votre tsconfig.json principal (ou tsconfig-prod.json, qui reste spécial pour la production). De toute façon, fournissez vos fichiers js compilés s'il vous plait. – Pavel

2

J'ai trouvé que dans rollup-config.js, dans le livre de cuisine ts, ils ont mis spécifiquement rxjs dans l'include commonJs. Si vous n'utilisez que rxjs, vous pourrez également utiliser des modules tiers.

Par exemple, j'utilise angular2 dématérialiser, donc:

commonjs({ 
    include: [ 
    'node_modules/rxjs/**', 
    'node_modules/angular2-materialize/**' 
    ], 

ou simplement tous comprennent (trouvé mieux, testé build.js, même taille):

commonjs({ 
    include: 'node_modules/**' 
}) 
+0

Je l'ai déjà essayé, mais ça n'aide pas avec moment.js et immutable.js –

+0

S'il vous plaît pouvez-vous fournir un exemple de travail angulaire2-matérialiser dans une construction AOT/Rollup- Je suis vraiment en train de lutter avec ce –

+1

@ P.Moloney Heureusement, j'ai un projet de démarrage juste pour cela que j'ai créé pour moi .. (le readme est pour vsCode) .. le readme est un peu pour moi ce n'est pas très détaillé ... son principalement pour le compilateur scss https: // github.com/Blazzze/Angular2CustomQuickstart –