带有 css <style> 标签的 Webpack Vue 组件无法构建,模块解析失败:意外的令牌
Webpack Vue component with css <style> tags fails to build with Module parse failed: Unexpected token
从一个干净的 vue 项目开始,我在从 PrimeVue 构建 .vue 组件时遇到了问题。
这些是现成的组件,应该真的不会失败。
每次我尝试构建时,它都失败了,并且似乎在 CSS 样式开头的行指针失败。
ERROR in ./node_modules/primevue/components/slider/Slider.vue?vue&type=style&index=0&lang=css& (./node_modules/vue-loader/lib??vue-loader-options!./node_modules/primevue/components/slider/Slider.vue?vue&type=style&index=0&lang=css&) 340:0
Module parse failed: Unexpected token (340:0)
File was processed with these loaders:
* ./node_modules/vue-loader/lib/index.js
You may need an additional loader to handle the result of these loaders.
|
|
> .p-slider {
| position: relative;
| }
@ ./node_modules/primevue/components/slider/Slider.vue?vue&type=style&index=0&lang=css& 1:0-119 1:135-138 1:140-256 1:140-256
@ ./node_modules/primevue/components/slider/Slider.vue
@ ./node_modules/primevue/slider.js
@ ./myproject/components/Test.js
@ ./myproject/components/App.js
@ ./myproject/main.js
这是我的 webpack 配置文件:
const path = require('path');
const { VueLoaderPlugin } = require('vue-loader');
module.exports = {
mode: 'development',
entry: 'main.js',
output: {
filename: 'main.bundle.js',
path: path.resolve(__dirname, 'dist'),
},
module: {
rules: [
{
test: /\.vue$/,
use: 'vue-loader'
}
]
},
plugins: [
new VueLoaderPlugin()
]
};
导致此错误的原因是什么,因为我正在按照 PrimeVue 文档的说明正确导入组件。
在 webpack 配置中设置规则将 .vue
文件发送到 vue-loader
进行处理是不够的。
您还需要指定如何处理 .css
文件,然后这也会应用于 .vue
文件中的标签。如果没有这条规则,它就不知道如何处理 <style>
块,即使您不打算使用其中的 .css 文件部分。
使用以下内容更新 webpack.config.js
的规则部分:
rules: [
{
test: /\.vue$/,
use: 'vue-loader'
},
// this will apply to both plain `.css` files
// AND `<style>` blocks in `.vue` files
{
test: /\.css$/,
use: [
'vue-style-loader',
'css-loader'
]
}
]
还要确保 vue-style-loader
和 css-loader
安装在 package.json。
更多信息可以在vue-loader文档的manual installation section找到,特别是'A more complete example webpack config will look like this.'
下的代码示例
我强烈建议缓存 .vue 文件,因为它们会减慢大型项目的构建时间。
// snippet from https://github.com/unic/darvin-webpack-boilerplate/blob/master/webpack/settings/javascript-vue/index.js
const {VueLoaderPlugin} = require('vue-loader');
const webpack = require('webpack');
const path = require('path');
const ROOT_PATH = process.cwd();
const CACHE_PATH = path.join(ROOT_PATH, 'tmp/cache');
const VUE_VERSION = require('vue/package.json').version;
const VUE_LOADER_VERSION = require('vue-loader/package.json').version;
const dev = {
module: {
rules: [
{
test: /\.vue$/,
loader: 'vue-loader',
options: {
cacheDirectory: path.join(CACHE_PATH, 'vue-loader'),
cacheIdentifier: [
process.env.NODE_ENV || 'development',
webpack.version,
VUE_VERSION,
VUE_LOADER_VERSION,
].join('|'),
},
}
]
},
plugins: [
new VueLoaderPlugin(),
],
resolve: {
alias: {
'vue$': 'vue/dist/vue.esm.js'
},
extensions: ['.js', '.vue', '.json'],
},
};
从一个干净的 vue 项目开始,我在从 PrimeVue 构建 .vue 组件时遇到了问题。 这些是现成的组件,应该真的不会失败。
每次我尝试构建时,它都失败了,并且似乎在 CSS 样式开头的行指针失败。
ERROR in ./node_modules/primevue/components/slider/Slider.vue?vue&type=style&index=0&lang=css& (./node_modules/vue-loader/lib??vue-loader-options!./node_modules/primevue/components/slider/Slider.vue?vue&type=style&index=0&lang=css&) 340:0
Module parse failed: Unexpected token (340:0)
File was processed with these loaders:
* ./node_modules/vue-loader/lib/index.js
You may need an additional loader to handle the result of these loaders.
|
|
> .p-slider {
| position: relative;
| }
@ ./node_modules/primevue/components/slider/Slider.vue?vue&type=style&index=0&lang=css& 1:0-119 1:135-138 1:140-256 1:140-256
@ ./node_modules/primevue/components/slider/Slider.vue
@ ./node_modules/primevue/slider.js
@ ./myproject/components/Test.js
@ ./myproject/components/App.js
@ ./myproject/main.js
这是我的 webpack 配置文件:
const path = require('path');
const { VueLoaderPlugin } = require('vue-loader');
module.exports = {
mode: 'development',
entry: 'main.js',
output: {
filename: 'main.bundle.js',
path: path.resolve(__dirname, 'dist'),
},
module: {
rules: [
{
test: /\.vue$/,
use: 'vue-loader'
}
]
},
plugins: [
new VueLoaderPlugin()
]
};
导致此错误的原因是什么,因为我正在按照 PrimeVue 文档的说明正确导入组件。
在 webpack 配置中设置规则将 .vue
文件发送到 vue-loader
进行处理是不够的。
您还需要指定如何处理 .css
文件,然后这也会应用于 .vue
文件中的标签。如果没有这条规则,它就不知道如何处理 <style>
块,即使您不打算使用其中的 .css 文件部分。
使用以下内容更新 webpack.config.js
的规则部分:
rules: [
{
test: /\.vue$/,
use: 'vue-loader'
},
// this will apply to both plain `.css` files
// AND `<style>` blocks in `.vue` files
{
test: /\.css$/,
use: [
'vue-style-loader',
'css-loader'
]
}
]
还要确保 vue-style-loader
和 css-loader
安装在 package.json。
更多信息可以在vue-loader文档的manual installation section找到,特别是'A more complete example webpack config will look like this.'
下的代码示例我强烈建议缓存 .vue 文件,因为它们会减慢大型项目的构建时间。
// snippet from https://github.com/unic/darvin-webpack-boilerplate/blob/master/webpack/settings/javascript-vue/index.js
const {VueLoaderPlugin} = require('vue-loader');
const webpack = require('webpack');
const path = require('path');
const ROOT_PATH = process.cwd();
const CACHE_PATH = path.join(ROOT_PATH, 'tmp/cache');
const VUE_VERSION = require('vue/package.json').version;
const VUE_LOADER_VERSION = require('vue-loader/package.json').version;
const dev = {
module: {
rules: [
{
test: /\.vue$/,
loader: 'vue-loader',
options: {
cacheDirectory: path.join(CACHE_PATH, 'vue-loader'),
cacheIdentifier: [
process.env.NODE_ENV || 'development',
webpack.version,
VUE_VERSION,
VUE_LOADER_VERSION,
].join('|'),
},
}
]
},
plugins: [
new VueLoaderPlugin(),
],
resolve: {
alias: {
'vue$': 'vue/dist/vue.esm.js'
},
extensions: ['.js', '.vue', '.json'],
},
};