我正在使用webpack捆绑我的javascript文件。
我的Webpack配置(使用gulp传递给webpack)如下所示:
var webpackConfig = {
context: __dirname,
entry: {
"app": "./js/app.js"
},
output: {
path: path.join(__dirname, ".."),
filename: "/js/[name].js",
chunkFilename: "/js/[id].js"
},
plugins: [
new webpack.ResolverPlugin(
new webpack.ResolverPlugin.DirectoryDescriptionFilePlugin("bower.json", ["main"])
)
],
resolve: {
modulesDirectories: ['js', 'bower_components', 'node_modules']
}
};
我的app.js
是一个简单的要求:
require('modernizr/modernizr.js');
Webpack构建文件没有任何问题,生成的文件包含modernizr。
问题是,当我在页面上包含文件并对其进行测试时,modernizr会出错:
TypeError: document is undefined
docElement = document.documentElement,
来自webpack的捆绑文件如下所示:
/******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ exports: {},
/******/ id: moduleId,
/******/ loaded: false
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.loaded = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(0);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ function(module, exports, __webpack_require__) {
__webpack_require__(1);
/***/ },
/* 1 */
/***/ function(module, exports, __webpack_require__) {
/*!
* Modernizr v2.8.3
* www.modernizr.com
*
* Copyright (c) Faruk Ates, Paul Irish, Alex Sexton
* Available under the BSD and MIT licenses: www.modernizr.com/license/
*/
/*
* Modernizr tests which native CSS3 and HTML5 features are available in
* the current UA and makes the results available to you in two ways:
* as properties on a global Modernizr object, and as classes on the
* <html> element. This information allows you to progressively enhance
* your pages with a granular level of control over the experience.
*
* Modernizr has an optional (not included) conditional resource loader
* called Modernizr.load(), based on Yepnope.js (yepnopejs.com).
* To get a build that includes Modernizr.load(), as well as choosing
* which tests to include, go to www.modernizr.com/download/
*
* Authors Faruk Ates, Paul Irish, Alex Sexton
* Contributors Ryan Seddon, Ben Alman
*/
window.Modernizr = (function( window, document, undefined ) {
var version = '2.8.3',
Modernizr = {},
/*>>cssclasses*/
// option for enabling the HTML classes to be added
enableClasses = true,
/*>>cssclasses*/
docElement = document.documentElement,
/** rest of modernizr code here **/
return Modernizr;
})(this, this.document);
/***/ }
/******/ ])
是什么导致了这个问题?
答案 0 :(得分:3)
在Webpack 2上,我认为我在{test: /modernizr/, loader: 'imports-loader?this=>window!exports-loader?window.Modernizr'}
中使用module.rules
让它工作了。
请参阅此处提交的此Webpack错误:https://github.com/webpack/webpack/issues/512#issuecomment-288143187
答案 1 :(得分:1)
此问题是由Modernizr将this.document
传递给它创建的闭包引起的。不幸的是,webpack将所有内容包装在另一个自己的闭包中,导致this.document
返回null
。
可以通过在需要时使用imports loader设置this
来解决问题:
require('imports?this=>window!modernizr/modernizr.js');
答案 2 :(得分:1)
我遇到了同样的问题,但并没有直接要求Modernizr。我需要一个包含Modernizr的库。早期的解决方案在该方案中不起作用。我最终最终使用了script-loader:
require('script!package/vendor-bundle.js);
答案 3 :(得分:0)
在Webpack配置文件中添加了以下内容:
module: {
...
loaders: [
...
{ test: /[\\\/]modernizr dependecie path[\\\/]modernizr\.js$/,
loader: "imports?this=>window!exports?window.Modernizr" }
...
]
}
为此,您需要安装imports-loader
和exports-loader
。