Tôi đang sử dụng Webpack trong ứng dụng của mình, trong đó tôi tạo hai điểm nhập - bundle.js cho tất cả các tệp / mã JavaScript của mình và nhà cung cấp.js cho tất cả các thư viện như jQuery và React. Tôi phải làm gì để sử dụng các plugin có jQuery làm phụ thuộc của chúng và tôi muốn có chúng trong nhà cung cấp? Điều gì xảy ra nếu các plugin đó có nhiều phụ thuộc?
Hiện tại tôi đang cố gắng sử dụng plugin jQuery này tại đây - https://github.com/mbklein/jquery-elastic . Tài liệu Webpack đề cập đến cung cấpPlugin và trình tải nhập. Tôi đã sử dụng cung cấpPlPlugin, nhưng vẫn không có đối tượng jQuery. Đây là cách webpack.config.js của tôi trông như thế nào-
var webpack = require('webpack');
var bower_dir = __dirname + '/bower_components';
var node_dir = __dirname + '/node_modules';
var lib_dir = __dirname + '/public/js/libs';
var config = {
addVendor: function (name, path) {
this.resolve.alias[name] = path;
this.module.noParse.push(new RegExp(path));
},
plugins: [
new webpack.ProvidePlugin({
$: "jquery",
jquery: "jQuery",
"window.jQuery": "jquery"
}),
new webpack.optimize.CommonsChunkPlugin('vendors', 'vendors.js', Infinity)
],
entry: {
app: ['./public/js/main.js'],
vendors: ['react','jquery']
},
resolve: {
alias: {
'jquery': node_dir + '/jquery/dist/jquery.js',
'jquery.elastic': lib_dir + '/jquery.elastic.source.js'
}
},
output: {
path: './public/js',
filename: 'bundle.js'
},
module: {
loaders: [
{ test: /\.js$/, loader: 'jsx-loader' },
{ test: /\.jquery.elastic.js$/, loader: 'imports-loader' }
]
}
};
config.addVendor('react', bower_dir + '/react/react.min.js');
config.addVendor('jquery', node_dir + '/jquery/dist/jquery.js');
config.addVendor('jquery.elastic', lib_dir +'/jquery.elastic.source.js');
module.exports = config;
Nhưng mặc dù vậy, nó vẫn gây ra lỗi trong bảng điều khiển trình duyệt:
Uncaught ReferenceError: jQuery không được xác định
Tương tự, khi tôi sử dụng trình tải nhập, nó sẽ báo lỗi,
yêu cầu không được xác định '
trong dòng này:
var jQuery = require("jquery")
Tuy nhiên, tôi có thể sử dụng cùng một plugin khi tôi không thêm nó vào tệp nhà cung cấp của mình và thay vào đó yêu cầu nó theo cách AMD thông thường như cách tôi bao gồm các tệp mã JavaScript khác của mình, như-
define(
[
'jquery',
'react',
'../../common-functions',
'../../libs/jquery.elastic.source'
],function($,React,commonFunctions){
$("#myInput").elastic() //It works
});
Nhưng đây không phải là điều tôi muốn làm, vì điều này có nghĩa là jquery.elastic.source.js được gói cùng với mã JavaScript của tôi trong bundle.js và tôi muốn tất cả các trình cắm jQuery của mình nằm trong gói nhà cung cấp. Vì vậy, làm thế nào để tôi đạt được điều này?