2016-12-05 51 views
0

我真的很纠结于奇怪的代码。为什么在我的webpack配置下需要javascript异步加载

我想在jQuery ajax请求中包含$.ajaxPrefilter的一些查询参数。 我发现下面的代码使它,如果它加载正确的同步顺序。 但是,在entry.js中的代码以不可预知的顺序加载了jscode。有时prefilter.js被预加载,另一次,post_ajaxs.js被预加载(我检查了服务器的post信息,有时缺少数据,我检查了使用时间加载铬devtools)。

require(['prefilter']) 

$(function(){ 
    if($("#page_id").length > 0) { 
     require([ 
      "src/common/post_ajax.js" 
     ]); 
    } 
}); 

这是为什么造成的?我很困惑,因为我首先想到require关键字是同步加载。 我显示webpack.config.js的部分片段可能是相关的。

entry: { 
/webroot/js/entry.js: __dirname+"/src/entry.js" 
}, 
resolve: { 
    alias: { 
    "prefilter": __dirname + "/src/common/prefilter.js", 
    } 
}, 
output: { 
    path: __dirname + "/webroot/js/", 
    filename: "[name].js", 
    chunkFilename: "[hash].[id].js?" + (+new Date()), 
    publicPath: "/js/" 
}, 
plugins: [ 
     new webpack.optimize.DedupePlugin(), 
     new webpack.optimize.OccurrenceOrderPlugin(), 
     new webpack.optimize.AggressiveMergingPlugin(), 
     new webpack.ProvidePlugin({ 
      $: "jquery", 
      jQuery: "jquery", 
      "window.jQuery": "jquery", 
      d3: "d3" 
     }) 
    ] 

我想后,强制预装prefilter.js和负载post_ajax。请给我帮助。我会很感激的任何信息。

编辑: 这里是prefilter.js。

$.ajaxPrefilter(function (options, originalOptions, jqXHR) { 
     options.data = $.param($.extend(originalOptions.data, {'data[extra]':$("#some_id").val() })); 
    } 
}); 

回答

0

这可能是范围问题,因为外部所需的js是全局作用域,并且不是由函数大括号嵌套。因为我使用require.ensure嵌套$(function {})并将require(['prefilter'])放入$(function {})的作用域来测试两个案例,所以这两个方法都能正常工作,但这两个方法都可以正常工作,但这是我的预测。 但是,如果你有更正确的答案。