我正在研究基于Angular,Webpack等的项目。当我想使用angular-summernote
时,我遇到了非常有趣的问题它不起作用,并给我一个错误“TypeError:element.summernote不是一个函数”。如果在没有任何构建工具的情况下将库添加为脚本标记,它会正常工作,但是对于Webpack,它不会。
所以,让我们看一下文件和配置
webpack.config.js
let webpack = require('webpack');
let path = require('path');
module.exports = {
entry: {
bundle: [
'./app/app.js'
]
},
output: {
path: path.join(__dirname, './public'),
filename: '[name].js',
},
resolve: {
root: __dirname,
extensions: ['', '.js'],
modulesDirectories: [
'node_modules',
'app'
],
},
externals: {
},
plugins: [
new webpack.ProvidePlugin({
$: 'jquery',
jQuery: 'jquery'
})
],
module: {
loaders: [
{
loader: 'babel-loader',
query: {
presets: ['es2015']
},
test: /\.js$/,
exclude: /(node_modules|bower_components)/
}
]
}
};
应用/ app.js
// Load libs
import angular from 'angular';
import ngRoute from 'angular-route';
import summernote from 'summernote';
import ngSummernote from 'angular-summernote/dist/angular-summernote.js';
// App
angular.module('app', [ngRoute, 'summernote'])
.config(function($routeProvider) {
// Router
$routeProvider
.when('/', {
template: '<summernote></summernote>'
});
});
我找到了github issue,但它仍处于开放状态。
我做了一些调试,检查了“summernote”指令的“link”方法,并将“element”记录到控制台,它的proto对象不包含任何jquery方法,包括“summernote”方法。 为什么?以及如何使其发挥作用?
答案 0 :(得分:2)
似乎 jquery 是按需使用的,而不是在其他脚本之前加载,因此它不会公开全局变量jQuery,也不会将适当的方法附加到元素上。
以下配置解决了此问题
<强> webpack.config.js 强>
let webpack = require('webpack');
let path = require('path');
module.exports = {
entry: {
bundle: [
// We tell webpack to add jquery as script tag before app script
// It will expose global variable jQuery and init jquery methods
'script!jquery/dist/jquery.min.js',
'./app/app.js'
]
},
output: {
path: path.join(__dirname, './public'),
filename: '[name].js',
},
resolve: {
root: __dirname,
extensions: ['', '.js'],
modulesDirectories: [
'node_modules',
'app'
],
},
externals: {
// This mean that require('jquery') will refer to global var jQuery
'jquery': 'jQuery'
},
plugins: [
// ProvidePlugin helps to recognize $ and jQuery words in code
// And replace it with require('jquery')
new webpack.ProvidePlugin({
$: 'jquery',
jQuery: 'jquery'
})
],
module: {
loaders: [
{
loader: 'babel-loader',
query: {
presets: ['es2015']
},
test: /\.js$/,
exclude: /(node_modules|bower_components)/
}
]
}
};
希望澄清 webpack 的工作原理会很有用。如果我错过了什么,请分享您的想法和评论。