我正在尝试让FabricJs与Webpack和Electron合作,目前还没有让它工作。
Failed to compile.
./~/bindings/bindings.js
76:22-40 Critical dependency: the request of a dependency is an expression
我试图用Webpack编译FabricJs时得到它。在Google和Stack Overflow上搜索过,我还没有找到合适的解决方案。
这是我在运行DEV compilin时收到的所有警告:
>警告在./~/bindings/bindings.js中 76:22-40关键依赖:依赖的请求是表达式 WARNING in ./~/bindings/bindings.js
76:43-53 Critical dependency: the request of a dependency is an expression
WARNING in ./~/ajv/lib/compile/index.js
13:21-34 Critical dependency: the request of a dependency is an expression
WARNING in ./~/ajv/lib/async.js
96:20-33 Critical dependency: the request of a dependency is an expression
WARNING in ./~/ajv/lib/async.js
119:15-28 Critical dependency: the request of a dependency is an expression
在我的main.js代码中,这正是所写的
import Vue from 'vue'
import Electron from 'vue-electron'
import Router from 'vue-router'
import Store from 'vuex'
import {fabric} from 'fabric'
我已尝试加载它,例如import' fabric'或从' fabric / dist / fabric.require'进口面料。和许多其他方式,它总是得到我相同的结果。
webpack配置文件分为两个文件:webpack.main.config.js和webpack.renderer.config.js
以下是webpack.main.config.js的内容
'use strict'
process.env.BABEL_ENV = 'main'
const path = require('path')
const pkg = require('./app/package.json')
const settings = require('./config.js')
const webpack = require('webpack')
console.log(pkg.dependencies)
let mainConfig = {
entry: {
main: path.join(__dirname, 'app/src/main/index.js')
},
externals: Object.keys(pkg.dependencies || {}),
module: {
exprContextCritical: false,
rules: [
{
test: /\.js$/,
loader: 'babel-loader',
exclude: /node_modules/
},
{
test: /\.js$/,
loader: 'babel-loader',
include: /camo/
},
{
test: /\.json$/,
loader: 'json-loader'
},
{
test: /\.node$/,
loader: 'node-loader'
}
]
},
node: {
__dirname: false,
__filename: false
},
output: {
filename: '[name].js',
libraryTarget: 'commonjs2',
path: path.join(__dirname, 'app/dist')
},
plugins: [
new webpack.NoEmitOnErrorsPlugin(),
new webpack.DefinePlugin({
'process.env.NODE_ENV': '"production"'
}),
new webpack.optimize.UglifyJsPlugin({
compress: {
warnings: false
}
})
],
resolve: {
extensions: ['.js', '.json', '.node'],
modules: [
path.join(__dirname, 'app/node_modules')
]
},
target: 'electron-main'
}
module.exports = mainConfig
这是webpack.renderer.config.js的内容
'use strict'
process.env.BABEL_ENV = 'renderer'
const path = require('path')
const pkg = require('./app/package.json')
const settings = require('./config.js')
const webpack = require('webpack')
const ExtractTextPlugin = require('extract-text-webpack-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const AssetsPlugins = require('assets-webpack-plugin')
const assetsPluginInstance = new AssetsPlugins()
let rendererConfig = {
devtool: '#eval-source-map',
devServer: { overlay: true },
entry: {
renderer: path.join(__dirname, 'app/src/renderer/main.js')
},
externals: Object.keys(pkg.dependencies || {}),
module: {
rules: [
{
test: /\.css$/,
use: ExtractTextPlugin.extract({
fallback: 'style-loader',
use: 'css-loader'
})
},
{
test: /\.html$/,
use: 'vue-html-loader'
},
{
test: /\.js$/,
use: 'babel-loader',
include: [ path.resolve(__dirname, 'app/src/renderer') ],
exclude: /node_modules/
},
{
test: /\.js$/,
loader: 'babel-loader',
include: /camo/
},
{
test: /\.json$/,
use: 'json-loader'
},
{
test: /\.node$/,
use: 'node-loader'
},
{
test: /\.vue$/,
use: {
loader: 'vue-loader',
options: {
loaders: {
sass: 'vue-style-loader!css-loader!sass-loader?indentedSyntax=1',
scss: 'vue-style-loader!css-loader!sass-loader'
}
}
}
},
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
use: {
loader: 'url-loader',
query: {
limit: 10000,
name: 'imgs/[name].[ext]'
}
}
},
{
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
use: {
loader: 'url-loader',
query: {
limit: 10000,
name: 'fonts/[name].[ext]'
}
}
}
]
},
plugins: [
assetsPluginInstance,
new ExtractTextPlugin('styles.css'),
new HtmlWebpackPlugin({
filename: 'index.html',
template: './app/index.ejs',
appModules: process.env.NODE_ENV !== 'production'
? path.resolve(__dirname, 'app/node_modules')
: false,
}),
new webpack.NoEmitOnErrorsPlugin()
],
output: {
filename: '[name].js',
libraryTarget: 'commonjs2',
path: path.join(__dirname, 'app/dist')
},
resolve: {
alias: {
'components': path.join(__dirname, 'app/src/renderer/components'),
'renderer': path.join(__dirname, 'app/src/renderer')
},
extensions: ['.js', '.vue', '.json', '.css', '.node'],
modules: [
path.join(__dirname, 'app/node_modules'),
path.join(__dirname, 'node_modules')
]
},
target: 'electron-renderer'
}
/**
* Adjust rendererConfig for production settings
*/
if (process.env.NODE_ENV === 'production') {
rendererConfig.devtool = ''
rendererConfig.plugins.push(
new webpack.DefinePlugin({
'process.env.NODE_ENV': '"production"'
}),
new webpack.LoaderOptionsPlugin({
minimize: true
}),
new webpack.optimize.UglifyJsPlugin({
compress: {
warnings: false
}
})
)
}
module.exports = rendererConfig
答案 0 :(得分:3)
您是否在没有可选的cairo依赖项的情况下安装结构(仅在节点中需要/有用)?
npm install fabric --no-optional
(见https://github.com/kangax/fabric.js/issues/2775)
我的解决方法最终使用script-loader,其功能与在< script>中包含fabric相同。浏览器中的标记(只是你获得了webpack捆绑的好处)
import "!script-loader!../static/fabricjs/fabric.js"
// window.fabric is now loaded
另外,我没有在npm上安装结构(因为它再次为节点安装了依赖项),但抓住了custom build - 虽然两者都可以正常工作。
答案 1 :(得分:1)
使用script-loader加载它终于使它适用于我的设置。
对于使用vue + webpack + fabric的人来说,最好将结构调用放在组件或Vue上的mount()方法中。