FabricJs,Webpack 未编译 - 关键依赖
FabricJs, Webpack not compiling - Critical dependency
我正在尝试让 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 编译时收到的所有警告:
./~/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' 或 import fabric from '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
您安装的 fabric 是否没有可选的 cairo 依赖项(只有 needed/useful 在 node 中)?
npm install fabric --no-optional
(参见 https://github.com/kangax/fabric.js/issues/2775)
我的解决方法最终使用了 script-loader ,它与在浏览器的
我正在尝试让 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 编译时收到的所有警告:
./~/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' 或 import fabric from '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
您安装的 fabric 是否没有可选的 cairo 依赖项(只有 needed/useful 在 node 中)?
npm install fabric --no-optional
(参见 https://github.com/kangax/fabric.js/issues/2775)
我的解决方法最终使用了 script-loader ,它与在浏览器的