加载Select2的src版本
Sean Larkin,其中一位 webpack 开发人员说:
大多数模块在 package.json 的 main 字段中链接 dist 版本。虽然这对大多数开发人员很有用,但对于 webpack 来说,最好为 src 版本起别名,因为这样 webpack 能够更好地优化依赖关系...1
按照这个建议,我更喜欢要求 src 文件夹下的文件:
require("select2/src/js/jquery.select2.js");
require('select2/src/scss/core.scss');
静态加载语言文件
然后您会发现需要克服各种与语言相关的障碍。只要你insert $(".dropdown").select2() 进入你的代码,你就会看到
Uncaught Error: Cannot find module './i18n/en'。这是因为为 RequireJS 设计的动态需求不起作用。来自translation.js中的loadPath函数:
if (!(path in Translation._cache)) {
var translations = require(path);
Translation._cache[path] = translations;
}
在 webpack 用语中,这称为“要求表达式”。我的解决方案是通过先启动缓存来避免到达那条线。在我的应用代码中,我输入了:
const EnglishTranslation=require("select2/src/js/select2/i18n/en");
const Translation=require("select2/src/js/select2/translation");
Translation._cache["./i18n/en"]=EnglishTranslation;
Translation._cache["en"]=EnglishTranslation;
您需要为您希望使用的所有语言执行此操作。
然后,您可以在初始化期间使用记录的语言功能,包括$.fn.select2.defaults.set('language',"en") 或language: en。像language: { noResults: function() { return "abc"; } } 这样的覆盖也可以工作。
禁用无上下文要求
上述说明为您提供了一个有效的 select2,但 Webpack 会抱怨,Critical dependency: the request of a dependency is an expression。这意味着,“webpack 需要包含当前文件夹中的所有文件以及子文件夹中的所有文件”2,这将是 select2/src/js/select2 下的所有内容!
我发现我可以使用imports-loader 完全禁用翻译模块中的require(),同时保持define() 调用不变,以便它仍然可以进行导出。这是我的webpack.config.js的摘录:
module: {
rules: [
{
test: /select2\/src\/js\/select2\/translation\.js$/,
use: {
loader: "imports-loader",
options: "require=>false"
}
]
}
编写自定义适配器
你可以使用 webpack 来 require() 各种组件来编写你自己的数据适配器。 select2 adapter documentation 假设您将使用提供的 Almond 加载程序(例如 $.fn.select2.amd.require),所以我花了一段时间才意识到我可以做这种事情:
var Utils = require("select2/src/js/select2/utils");
var ArrayAdapter = require("select2/src/js/select2/data/array");
提示
- 在诊断语言问题时打开
$.fn.select2.defaults.set('debug',true);。
- 将
$("html").removeAttr("lang"); 添加到您的应用中,避免使用奇怪的默认语言。