WebpackOptionsValidationError 无效配置 webpack(config)
WebpackOptionsValidationError Invalid Configuration webpack(config)
我正在构建一个基础网络服务器,我计划将其用于未来的项目。我正在设置一个完整的 javascript 堆栈。我正在使用 Express、Webpack 和 Babel。
问题是在通过 Express 设置 hmr 时,配置文件 运行 进入验证错误。
配置文件在 webpack-dev-server 和 Express 的基本设置下运行良好。然而,当通过 webpack(config)
调用时,配置错误。
webpack.config.js
require('@babel/register');
module.exports = require('./webpack.config.babel.js');
webpack.config.babel.js
import path from 'path'
import webpack from 'webpack'
import WebpackBar from 'webpackbar'
import merge from 'webpack-merge'
import HtmlWebpackPlugin from 'html-webpack-plugin'
import MiniCssExtractPlugin from 'mini-css-extract-plugin'
import common from './webpack.common.babel'
export default merge(common, {
mode: 'production',
target: 'web',
output: {
path: path.resolve(__dirname, './dist'),
filename: `[name].js`,
publicPath: '/',
library: 'kerillian',
libraryTarget: 'umd'
},
module: {
rules: [
{
test: /\.(sc|c)ss$/,
use: [
{
loader: MiniCssExtractPlugin.loader,
options: {
includePaths: [
path.resolve(__dirname, 'node_modules/')
]
}
},
'css-loader',
'sass-loader'
]
}
]
},
plugins: [
new MiniCssExtractPlugin({
filename: '[name].css'
}),
new webpack.HotModuleReplacementPlugin(),
new HtmlWebpackPlugin({
filename:'./templates/template.html',
template: './src/html/template.html',
inject: 'body'
}),
new WebpackBar()
]
})
webpack.common.babel.js
import path from 'path'
import webpack from 'webpack'
const config = {
entry: {
index: './src/js/index.js'
},
performance: {
hints: false
},
externals: {
jquery: 'jquery'
},
optimization: {
splitChunks: {
name: true,
cacheGroups: {
index: {
test: /static\/js/
},
vendors: {
test: /([\/]node_modules[\/])/,
name: 'vendor',
chunks: 'all'
}
}
}
},
module: {
rules: [
{
test: /\.(ttf|eot|woff|woff2)$/,
loader: 'file-loader',
options: {
name: path.resolve(__dirname,`./dist/public/fonts/[name].[ext]`),
}
},
{
test: /\.(png|svg|gif|jpg)$/,
loader: 'file-loader',
options: {
name: path.resolve(__dirname,`./dist/public/images/[name].[ext]`),
},
},
{
test: /\.(html)$/,
use: {
loader: 'html-loader',
options: { minimize: true }
}
},
{
test: /\.(js|jsx)$/,
exclude: /node_modules/,
loader: 'babel-loader',
query: {
presets: ['@babel/preset-env']
}
}
]
},
plugins: [
new webpack.NamedModulesPlugin(),
new webpack.ProvidePlugin({
$: 'jquery',
jQuery: 'jquery',
'window.jQuery': 'jquery'
}),
],
resolve: {
modules: ['src', 'node_modules'],
extensions: ['.js', '.css'],
alias: {
milligram: path.join(__dirname, '/node_modules/milligram/dist/milligram.css')
}
}
}
export default config
server.js
require('dotenv').config()
const path = require('path')
const express = require('express')
const graphqlHTTP = require('express-graphql')
const { GraphQLSchema } = require('graphql')
const connect = require('../database/database.js')
const isDeveloping = process.env.DEV
connect.connectDB()
const schema = new GraphQLSchema({})
const app = express(),
DIST_DIR = './dist',
HTML_FILE = path.join(DIST_DIR, '/templates/template.html')
if(isDeveloping){
const webpack =require('webpack')
let webpackMiddleware = require('webpack-dev-middleware')
let webpackHotMiddleware = require('webpack-hot-middleware')
let config = require('../../webpack.config.js')
let compiler = webpack(config);
app.use(webpackMiddleware)
app.use(webpackHotMiddleware(compiler))
} else {
app.use(express.static(`${DIST_DIR}`))
app.use(express.static(`${DIST_DIR}/public`))
}
app.use('/graphql', graphqlHTTP({
schema: schema,
graphql: true
}))
app.get('*', (req, res) => {
res.sendFile(HTML_FILE, { root: './'})
})
const PORT = process.env.PORT || 3000
app.listen(PORT, () => {
console.log(`App listening to ${PORT}...`)
console.log("Press Ctrl-C to quit")
})
错误
kerillian | ✔ Webpack
kerillian | Compiled successfully in 4.34s
kerillian |
kerillian | Hash: b216aa3c06ff5b3496ac
kerillian | Version: webpack 4.39.1
kerillian | Time: 4346ms
kerillian | Built at: 08/08/2019 6:39:38 PM
kerillian | Asset Size Chunks Chunk Names
kerillian | ./templates/template.html 308 bytes [emitted]
kerillian | index.js 8.88 KiB 0 [emitted] index
kerillian | vendor.css 9.85 KiB 1 [emitted] vendor
kerillian | vendor.js 117 KiB 1 [emitted] vendor
kerillian | Entrypoint index = vendor.css vendor.js index.js
kerillian | [./node_modules/webpack/buildin/global.js] (webpack)/buildin/global.js 472 bytes {1} [built]
kerillian | [./src/js/index.js] ./src/js/index.js + 1 modules 423 bytes {0} [built]
kerillian | | ./src/js/index.js 108 bytes [built]
kerillian | | ./src/views/App.js 300 bytes [built]
kerillian | + 9 hidden modules
kerillian | Child html-webpack-plugin for "templates/template.html":
kerillian | 1 asset
kerillian | Entrypoint undefined = ./templates/template.html
kerillian | [./node_modules/html-webpack-plugin/lib/loader.js!./src/html/template.html] 175 bytes {0} [built]
kerillian | Child mini-css-extract-plugin node_modules/css-loader/dist/cjs.js!node_modules/sass-loader/lib/loader.js!node_modules/milligram/dist/milligram.css:
kerillian | Entrypoint mini-css-extract-plugin = *
kerillian | 2 modules
kerillian | {
kerillian | default: {
kerillian | entry: { index: './src/js/index.js' },
kerillian | performance: { hints: false },
kerillian | externals: { jquery: 'jquery' },
kerillian | optimization: { splitChunks: [Object] },
kerillian | module: { rules: [Array] },
kerillian | plugins: [
kerillian | [NamedModulesPlugin],
kerillian | [ProvidePlugin],
kerillian | [MiniCssExtractPlugin],
kerillian | [HotModuleReplacementPlugin],
kerillian | [HtmlWebpackPlugin],
kerillian | [WebpackBarPlugin]
kerillian | ],
kerillian | resolve: { modules: [Array], extensions: [Array], alias: [Object] },
kerillian | mode: 'production',
kerillian | target: 'web',
kerillian | output: {
kerillian | path: '/usr/src/app/dist',
kerillian | filename: '[name].js',
kerillian | publicPath: '/',
kerillian | library: 'kerillian'
kerillian | }
kerillian | }
kerillian | }
kerillian | /usr/src/app/node_modules/webpack/lib/webpack.js:31
kerillian | throw new WebpackOptionsValidationError(webpackOptionsValidationErrors);
kerillian | ^
kerillian |
kerillian | WebpackOptionsValidationError: Invalid configuration object. Webpack has been initialised using a configuration object that does not match the API schema.
kerillian | - configuration has an unknown property 'default'. These properties are valid:
kerillian | object { amd?, bail?, cache?, context?, dependencies?, devServer?, devtool?, entry?, externals?, infrastructureLogging?, loader?, mode?, module?, name?, node?, optimization?, output?, parallelism?, performance?, plugins?, profile?, recordsInputPath?, recordsOutputPath?, recordsPath?, resolve?, resolveLoader?, serve?, stats?, target?, watch?, watchOptions? }
kerillian | For typos: please correct them.
kerillian | For loader options: webpack >= v2.0.0 no longer allows custom properties in configuration.
kerillian | Loaders should be updated to allow passing options via loader options in module.rules.
kerillian | Until loaders are updated one can use the LoaderOptionsPlugin to pass these options to the loader:
kerillian | plugins: [
kerillian | new webpack.LoaderOptionsPlugin({
kerillian | // test: /\.xxx$/, // may apply this only for some modules
kerillian | options: {
kerillian | default: …
kerillian | }
kerillian | })
kerillian | ]
kerillian | at webpack (/usr/src/app/node_modules/webpack/lib/webpack.js:31:9)
kerillian | at Object.<anonymous> (/usr/src/app/config/server/server.js:23:20)
kerillian | at Module._compile (internal/modules/cjs/loader.js:777:30)
kerillian | at Object.Module._extensions..js (internal/modules/cjs/loader.js:788:10)
kerillian | at Module.load (internal/modules/cjs/loader.js:643:32)
kerillian | at Function.Module._load (internal/modules/cjs/loader.js:556:12)
kerillian | at Function.Module.runMain (internal/modules/cjs/loader.js:840:10)
kerillian | at internal/main/run_main_module.js:17:11
这个问题的简单答案是 webpack-middleware 和 babel 符合的格式之间的不兼容。这些系统只是不能协同工作。我已经放弃这种方法,而是使用 nodedemon
和 webpack --watch
.
虽然这不是最被接受的设置节点热重载功能的方法,但它在我为这个项目设置的 dockerized 开发环境中运行良好。
我遇到了与 WebpackOptionsValidationError
相同的问题,我确信中间件如何为 webpack 配置提供服务存在问题。
我确信中间件+babel 是可行的,因为我为另一个项目做了相同的设置。
所以...问题是您在 webpack.config.babel.js
中 export default
(es6),但在 server.js
中 require
(cjs)。这是行不通的,因为 require
是有条件地调用的,而这在 (es6) 中是不可能的。这是我能找到的最好的解释。
解决方案是 module.export
你的 webpack 配置,它会起作用,这已经解决了我这边的问题。
我正在构建一个基础网络服务器,我计划将其用于未来的项目。我正在设置一个完整的 javascript 堆栈。我正在使用 Express、Webpack 和 Babel。
问题是在通过 Express 设置 hmr 时,配置文件 运行 进入验证错误。
配置文件在 webpack-dev-server 和 Express 的基本设置下运行良好。然而,当通过 webpack(config)
调用时,配置错误。
webpack.config.js
require('@babel/register');
module.exports = require('./webpack.config.babel.js');
webpack.config.babel.js
import path from 'path'
import webpack from 'webpack'
import WebpackBar from 'webpackbar'
import merge from 'webpack-merge'
import HtmlWebpackPlugin from 'html-webpack-plugin'
import MiniCssExtractPlugin from 'mini-css-extract-plugin'
import common from './webpack.common.babel'
export default merge(common, {
mode: 'production',
target: 'web',
output: {
path: path.resolve(__dirname, './dist'),
filename: `[name].js`,
publicPath: '/',
library: 'kerillian',
libraryTarget: 'umd'
},
module: {
rules: [
{
test: /\.(sc|c)ss$/,
use: [
{
loader: MiniCssExtractPlugin.loader,
options: {
includePaths: [
path.resolve(__dirname, 'node_modules/')
]
}
},
'css-loader',
'sass-loader'
]
}
]
},
plugins: [
new MiniCssExtractPlugin({
filename: '[name].css'
}),
new webpack.HotModuleReplacementPlugin(),
new HtmlWebpackPlugin({
filename:'./templates/template.html',
template: './src/html/template.html',
inject: 'body'
}),
new WebpackBar()
]
})
webpack.common.babel.js
import path from 'path'
import webpack from 'webpack'
const config = {
entry: {
index: './src/js/index.js'
},
performance: {
hints: false
},
externals: {
jquery: 'jquery'
},
optimization: {
splitChunks: {
name: true,
cacheGroups: {
index: {
test: /static\/js/
},
vendors: {
test: /([\/]node_modules[\/])/,
name: 'vendor',
chunks: 'all'
}
}
}
},
module: {
rules: [
{
test: /\.(ttf|eot|woff|woff2)$/,
loader: 'file-loader',
options: {
name: path.resolve(__dirname,`./dist/public/fonts/[name].[ext]`),
}
},
{
test: /\.(png|svg|gif|jpg)$/,
loader: 'file-loader',
options: {
name: path.resolve(__dirname,`./dist/public/images/[name].[ext]`),
},
},
{
test: /\.(html)$/,
use: {
loader: 'html-loader',
options: { minimize: true }
}
},
{
test: /\.(js|jsx)$/,
exclude: /node_modules/,
loader: 'babel-loader',
query: {
presets: ['@babel/preset-env']
}
}
]
},
plugins: [
new webpack.NamedModulesPlugin(),
new webpack.ProvidePlugin({
$: 'jquery',
jQuery: 'jquery',
'window.jQuery': 'jquery'
}),
],
resolve: {
modules: ['src', 'node_modules'],
extensions: ['.js', '.css'],
alias: {
milligram: path.join(__dirname, '/node_modules/milligram/dist/milligram.css')
}
}
}
export default config
server.js
require('dotenv').config()
const path = require('path')
const express = require('express')
const graphqlHTTP = require('express-graphql')
const { GraphQLSchema } = require('graphql')
const connect = require('../database/database.js')
const isDeveloping = process.env.DEV
connect.connectDB()
const schema = new GraphQLSchema({})
const app = express(),
DIST_DIR = './dist',
HTML_FILE = path.join(DIST_DIR, '/templates/template.html')
if(isDeveloping){
const webpack =require('webpack')
let webpackMiddleware = require('webpack-dev-middleware')
let webpackHotMiddleware = require('webpack-hot-middleware')
let config = require('../../webpack.config.js')
let compiler = webpack(config);
app.use(webpackMiddleware)
app.use(webpackHotMiddleware(compiler))
} else {
app.use(express.static(`${DIST_DIR}`))
app.use(express.static(`${DIST_DIR}/public`))
}
app.use('/graphql', graphqlHTTP({
schema: schema,
graphql: true
}))
app.get('*', (req, res) => {
res.sendFile(HTML_FILE, { root: './'})
})
const PORT = process.env.PORT || 3000
app.listen(PORT, () => {
console.log(`App listening to ${PORT}...`)
console.log("Press Ctrl-C to quit")
})
错误
kerillian | ✔ Webpack
kerillian | Compiled successfully in 4.34s
kerillian |
kerillian | Hash: b216aa3c06ff5b3496ac
kerillian | Version: webpack 4.39.1
kerillian | Time: 4346ms
kerillian | Built at: 08/08/2019 6:39:38 PM
kerillian | Asset Size Chunks Chunk Names
kerillian | ./templates/template.html 308 bytes [emitted]
kerillian | index.js 8.88 KiB 0 [emitted] index
kerillian | vendor.css 9.85 KiB 1 [emitted] vendor
kerillian | vendor.js 117 KiB 1 [emitted] vendor
kerillian | Entrypoint index = vendor.css vendor.js index.js
kerillian | [./node_modules/webpack/buildin/global.js] (webpack)/buildin/global.js 472 bytes {1} [built]
kerillian | [./src/js/index.js] ./src/js/index.js + 1 modules 423 bytes {0} [built]
kerillian | | ./src/js/index.js 108 bytes [built]
kerillian | | ./src/views/App.js 300 bytes [built]
kerillian | + 9 hidden modules
kerillian | Child html-webpack-plugin for "templates/template.html":
kerillian | 1 asset
kerillian | Entrypoint undefined = ./templates/template.html
kerillian | [./node_modules/html-webpack-plugin/lib/loader.js!./src/html/template.html] 175 bytes {0} [built]
kerillian | Child mini-css-extract-plugin node_modules/css-loader/dist/cjs.js!node_modules/sass-loader/lib/loader.js!node_modules/milligram/dist/milligram.css:
kerillian | Entrypoint mini-css-extract-plugin = *
kerillian | 2 modules
kerillian | {
kerillian | default: {
kerillian | entry: { index: './src/js/index.js' },
kerillian | performance: { hints: false },
kerillian | externals: { jquery: 'jquery' },
kerillian | optimization: { splitChunks: [Object] },
kerillian | module: { rules: [Array] },
kerillian | plugins: [
kerillian | [NamedModulesPlugin],
kerillian | [ProvidePlugin],
kerillian | [MiniCssExtractPlugin],
kerillian | [HotModuleReplacementPlugin],
kerillian | [HtmlWebpackPlugin],
kerillian | [WebpackBarPlugin]
kerillian | ],
kerillian | resolve: { modules: [Array], extensions: [Array], alias: [Object] },
kerillian | mode: 'production',
kerillian | target: 'web',
kerillian | output: {
kerillian | path: '/usr/src/app/dist',
kerillian | filename: '[name].js',
kerillian | publicPath: '/',
kerillian | library: 'kerillian'
kerillian | }
kerillian | }
kerillian | }
kerillian | /usr/src/app/node_modules/webpack/lib/webpack.js:31
kerillian | throw new WebpackOptionsValidationError(webpackOptionsValidationErrors);
kerillian | ^
kerillian |
kerillian | WebpackOptionsValidationError: Invalid configuration object. Webpack has been initialised using a configuration object that does not match the API schema.
kerillian | - configuration has an unknown property 'default'. These properties are valid:
kerillian | object { amd?, bail?, cache?, context?, dependencies?, devServer?, devtool?, entry?, externals?, infrastructureLogging?, loader?, mode?, module?, name?, node?, optimization?, output?, parallelism?, performance?, plugins?, profile?, recordsInputPath?, recordsOutputPath?, recordsPath?, resolve?, resolveLoader?, serve?, stats?, target?, watch?, watchOptions? }
kerillian | For typos: please correct them.
kerillian | For loader options: webpack >= v2.0.0 no longer allows custom properties in configuration.
kerillian | Loaders should be updated to allow passing options via loader options in module.rules.
kerillian | Until loaders are updated one can use the LoaderOptionsPlugin to pass these options to the loader:
kerillian | plugins: [
kerillian | new webpack.LoaderOptionsPlugin({
kerillian | // test: /\.xxx$/, // may apply this only for some modules
kerillian | options: {
kerillian | default: …
kerillian | }
kerillian | })
kerillian | ]
kerillian | at webpack (/usr/src/app/node_modules/webpack/lib/webpack.js:31:9)
kerillian | at Object.<anonymous> (/usr/src/app/config/server/server.js:23:20)
kerillian | at Module._compile (internal/modules/cjs/loader.js:777:30)
kerillian | at Object.Module._extensions..js (internal/modules/cjs/loader.js:788:10)
kerillian | at Module.load (internal/modules/cjs/loader.js:643:32)
kerillian | at Function.Module._load (internal/modules/cjs/loader.js:556:12)
kerillian | at Function.Module.runMain (internal/modules/cjs/loader.js:840:10)
kerillian | at internal/main/run_main_module.js:17:11
这个问题的简单答案是 webpack-middleware 和 babel 符合的格式之间的不兼容。这些系统只是不能协同工作。我已经放弃这种方法,而是使用 nodedemon
和 webpack --watch
.
虽然这不是最被接受的设置节点热重载功能的方法,但它在我为这个项目设置的 dockerized 开发环境中运行良好。
我遇到了与 WebpackOptionsValidationError
相同的问题,我确信中间件如何为 webpack 配置提供服务存在问题。
我确信中间件+babel 是可行的,因为我为另一个项目做了相同的设置。
所以...问题是您在 webpack.config.babel.js
中 export default
(es6),但在 server.js
中 require
(cjs)。这是行不通的,因为 require
是有条件地调用的,而这在 (es6) 中是不可能的。这是我能找到的最好的解释。
解决方案是 module.export
你的 webpack 配置,它会起作用,这已经解决了我这边的问题。