2017-04-11 5 views
0

J'utilise une lib qui est distribué sous forme de modules umd et le code d'un du fichier j'importe ressemble à cemodule n'est pas un chargeur doit avoir une fonction normale ou pas

lib.js

(function (global, factory) { 
    if (typeof define === "function" && define.amd) { 
     define(['exports', '../utils/require-isdefined-plugin!lodash'], factory); 
    } else if (typeof exports !== "undefined") { 
     factory(exports, require('lodash')); 
    } else { 
     var mod = { 
      exports: {} 
     }; 
     factory(mod.exports, global.lodash); 
     global.registry = mod.exports; 
    } 
})(this, function (exports, _lodash) { 
    'use strict'; 
    // Library code 
}) 

et maintenant quand j'utilise cette lib.js dans mon code et exécuter webpack, il jette cette erreur

erreur: H » Module: \ Projects \ abc \ umd \ app \ utils \ require-isDefined-plugin .js 'n'est pas un loader (doit avoir une fonction normale ou pitch)

Je pense que webpack traite "../utils/require-isdefined-plugin" comme un chargeur et se plaint.

Ma question est de savoir comment puis-je laisser savoir webpack que ce n'est pas un chargeur et d'exécuter ce fichier normalement ou

est-il une autre façon de faire ce travail?

Répondre

1

La solution la plus simple et franchement la meilleure serait d'utiliser une construction différente. La plupart des bibliothèques ont de nos jours une construction UMD ainsi qu'un paquet npm.

Si ce n'est pas une option que vous pouvez utiliser imports-loader pour désactiver l'AMD define comme indiqué dans Shimming - imports-loader, si webpack ne touche pas et utilisera la version CommonJS. Vous ajoutez une règle pour la bibliothèque:

{ 
    test: require.resolve('./path/to/lib'), 
    loader: 'imports-loader?define=>false' 
} 

require.resolve fonctionne comme le require régulier mais vous donne le chemin complet du module résolu au lieu de son contenu, de sorte que vous pouvez toujours faire require.resolve('lib') si c'est comment vous avez importé il. Par sécurité, vous devez également exclure la bibliothèque de votre règle habituelle .js, car deux règles pour un même fichier ne se terminent généralement pas correctement. Vos règles peuvent ressembler à ceci:

rules: [ 
    { 
    test: /\.js$/, 
    loader: 'babel-loader', 
    exclude: [/node_modules/, require.resolve('./path/to/lib')] 
    }, 
    { 
    test: require.resolve('./path/to/lib'), 
    loader: 'imports-loader?define=>false' 
    } 
]