2017-04-11 28 views
0

我使用的分布作为UMD模块lib和代码从我正在导入看起来像这样模块未装载必须具有正常或音调功能

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 
}) 

,现在当我使用这个lib.js在我的代码和运行的WebPack,它抛出这个错误

错误:模块“H:\项目\ ABC \ UMD \程序\ utils的\要求-isdefined-插件.js'不是加载程序(必须具有正常或音调功能)

我认为是的WebPack治疗“../utils/require-isdefined-plugin”作为装载机和抱怨。

我的问题是如何,我让的WebPack知道这是不是一个加载并执行此文件通常或

有没有其他的办法,使这项工作?

回答

1

最简单,坦率地说最好的解决办法是使用一个不同的版本。现在大多数图书馆都有UMD版本以及npm套件。

如果不是,您可以使用imports-loader禁用AMD define如图Shimming - imports-loader的选项,所以的WebPack不能触摸它,将使用CommonJS的版本。你会添加一个规则库:

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

require.resolve的工作方式相同的常规require但给你的解决模块,而不是其内容的完整路径,所以你仍然可以做require.resolve('lib')如果这就是你如何导入它。

为了安全起见,你也应该排除从常规.js规则库,因为有同一个文件的两个规则通常不会有好下场的。您的规则可能是这样的:

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' 
    } 
]