TypeError: element.summernote is not a function
TypeError: element.summernote is not a function
我正在开发基于 Angular、Webpack 等的项目。当我想使用 angular-summernote
时,我遇到了一个非常有趣的问题
它不起作用,并给我一个错误 "TypeError: element.summernote is not a function"。如果在没有任何构建工具的情况下将库作为脚本标签添加,它可以正常工作,但使用 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/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" 记录到控制台,它的原型对象不包含任何 jquery 方法,包括"summernote" 方法。 为什么?以及如何让它发挥作用?
好像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 的工作原理对您有所帮助。如果我遗漏了什么,请分享您的想法和评论。
我正在开发基于 Angular、Webpack 等的项目。当我想使用 angular-summernote
时,我遇到了一个非常有趣的问题它不起作用,并给我一个错误 "TypeError: element.summernote is not a function"。如果在没有任何构建工具的情况下将库作为脚本标签添加,它可以正常工作,但使用 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/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" 记录到控制台,它的原型对象不包含任何 jquery 方法,包括"summernote" 方法。 为什么?以及如何让它发挥作用?
好像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 的工作原理对您有所帮助。如果我遗漏了什么,请分享您的想法和评论。