试图用webpack来获取jquery的部分内容

时间:2016-03-08 20:34:37

标签: javascript jquery webpack

using this article只导入我需要的jquery部分。

但是,在使用此代码时遇到了一个问题:

let $ = require('jquery/src/core');
require('jquery/src/core/init');
require('jquery/src/css');
console.log($);

我收到此错误:

ERROR in ./~/jquery/src/selector-sizzle.js
Module not found: Error: Cannot resolve 'file' or 'directory' ../external/sizzle/dist/sizzle in /home/vamsi/Do/highland-fun/bacon-form/node_modules/jquery/src
 @ ./~/jquery/src/selector-sizzle.js 1:0-14:3

这是我的webpack.config.js文件:

module.exports = {
    entry:'./app',
    output:{
      filename:'./bundle'
    },
    modules:{
      loaders:[
        {
           test:/jquery[\\\/]src[\\\/]selector\.js$/,
           loaders:['amd-define-factory-patcher-loader']
        }
      ]
    }
}

我尝试使用resolve.alias来解决此问题:

resolve:{                                                                
  alias:{                                                                
   '../external/sizzle/dist/sizzle':'./node_modules/sizzle/dist/sizzle.js'
  }                                                                      
}

但它仍然会抛出与以前相同的错误。

1 个答案:

答案 0 :(得分:12)

问题

  

using this article只导入我需要的jquery部分。

本文是在jquery 2.2.0发布之前编写的。

jquery 2.1.x

// jquery/src/selector-sizzle.js

define([
    "./core",
    "sizzle"
], function( jQuery, Sizzle ) {
  //...
})

因此,sizzle已解析为<base-dir>/node_modules/sizzle

但是在 jquery 2.2.x

// jquery/src/selector-sizzle.js

define([
    "./core",
    "../external/sizzle/dist/sizzle" // <- missing
], function( jQuery, Sizzle ) {
  //...
})

如果您查看<base-dir>/node_modules/jquery,则会看到<base-dir>/node_modules/jquery/external丢失。该目录存在于jquery repo中,但在jquery npm包中被忽略。

解决方案

不幸的是,我没有设法用webpack的resolve.alias以任何方式解决这个问题。 或者,其中一个解决方案将适合您:

  • 使用jquery 2.1.4 - &gt; "jquery": "~2.1.4"
  • 继续使用jquery 2.2.x并使用string-replace-loader作为预加载器,将"../external/sizzle/dist/sizzle"替换为"sizzle"

npm i string-replace-loader --save-dev

// webpack.config.js

module.exports = {
    //...
    module: {
        preLoaders: [{
            test: /jquery[\\\/]src[\\\/]selector-sizzle\.js$/,
            loader: 'string-replace',
            query: {
                search: '../external/sizzle/dist/sizzle',
                replace: 'sizzle'
            }
        }]
    }
    //...
};

注意:在这两种解决方案中,您都必须npm i sizzle --save