我使用Vue cli创建了一个vue 3项目。我使用webpack配置来管理我的构建。当我将我的vue包指向vue.runtime.esm-browser.js时,我在浏览器控制台中收到一个警告。“[Vue warn]:组件提供了模板选项,但此版本的Vue不支持运行时编译。请改用“vue.esm-browser.js”。
当我检查文档时,它被提到为“vue-loader”插件将html模板转换为渲染函数。看起来我缺少了一些需要webpack的东西。
条目文件:main.js
import { createApp } from "vue";
import corecomponentA from "../core/components/corecomponentA.vue";
createApp({
components: {
"core-component-a": corecomponentA,
},
}).mount("#app");
Web包配置. js
var path = require("path");
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
const { VueLoaderPlugin } = require("vue-loader");
const UglifyJsPlugin = require("uglifyjs-webpack-plugin");
const BundleAnalyzerPlugin = require("webpack-bundle-analyzer")
.BundleAnalyzerPlugin;
const WebpackBar = require("webpackbar");
module.exports = (env, options) => {
const devMode = options.mode != "production";
return {
entry: {
"vue-bundle-store": "./src/entry/main.js",
},
output: {
path: path.resolve(
__dirname,
"./../ui.clientlibs/src/js/"
),
filename: "[name].js",
chunkFilename: "[name].js",
publicPath: process.env.BASE_URL,
},
module: {
rules: [
{
enforce: "pre",
test: /\.js$/,
exclude: /node_modules/,
loader: "eslint-loader",
},
{
test: /\.vue$/,
loader: "vue-loader",
},
{
test: /\.js$/,
loader: "babel-loader",
exclude: "/node_modules/",
query: {
presets: ["@babel/preset-env"],
},
},
{
test: /\.ts$/,
exclude: /node_modules/,
use: [
{
loader: "babel-loader",
options: { babelrc: true },
},
{
loader: "ts-loader",
options: { appendTsSuffixTo: [/\.vue$/] },
},
],
},
],
},
stats: {
colors: true,
},
optimization: {
splitChunks: {
cacheGroups: {
commons: {
test: /[\\/]node_modules[\\/]/,
name: "vendor-bundle",
chunks: "all",
},
},
},
minimizer: !devMode
? [
new UglifyJsPlugin({
sourceMap: false,
uglifyOptions: {
chunkFilter: (chunk) => {
if (chunk.name === "vendor-bundle") {
return false;
}
return true;
},
compress: {
drop_console: true,
},
mangle: {
reserved: ["vueIns", "args", "el"],
},
},
}),
]
: [],
},
devtool: "source-map",
plugins: [
new CleanWebpackPlugin(),
new VueLoaderPlugin(),
new WebpackBar(),
new BundleAnalyzerPlugin({
analyzerPort: 4000,
openAnalyzer: false,
analyzerMode: "static",
}),
] ,
resolve: {
extensions: [".ts", ".js", ".vue", ".json"],
alias: {
vue: devMode ? "vue/dist/vue.runtime.esm-browser.js" : "vue/dist/vue.runtime.esm-browser.prod.js"
}
}
};
};
核心组件A.vue
<script lang="ts">
import { h, ref, reactive } from "vue";
export default {
setup() {
const str = ref("Core component B");
const object = reactive({ foo: "bar" });
return () => h("div", [str.value, object.foo]);
}
};
</script>
包. json
{
"name": "vue3.test",
"version": "0.1.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"test:unit": "vue-cli-service test:unit",
"lint": "vue-cli-service lint",
"analyze-bundle": "webpack-bundle-analyzer stats.json",
"bundle": "webpack --mode=production --env.production --config webpack.config.js",
"bundle-dev": "webpack --mode=development --env.production=false --config webpack.config.js",
"stats": "webpack --mode=production --env.production --config webpack.config.js --profile --json > stats.json"
},
"dependencies": {
"vue": "^3.0.2"
},
"devDependencies": {
"@types/jest": "^24.0.19",
"@typescript-eslint/eslint-plugin": "^2.33.0",
"@typescript-eslint/parser": "^2.33.0",
"@vue/cli-plugin-babel": "~4.5.0",
"@vue/cli-plugin-eslint": "~4.5.0",
"@vue/cli-plugin-typescript": "~4.5.0",
"@vue/cli-plugin-unit-jest": "~4.5.0",
"@vue/cli-service": "~4.5.0",
"@vue/compiler-sfc": "^3.0.2",
"@vue/eslint-config-prettier": "^6.0.0",
"@vue/eslint-config-typescript": "^5.0.2",
"@vue/test-utils": "^2.0.0-0",
"clean-webpack-plugin": "^3.0.0",
"core-js": "^3.6.5",
"eslint": "^6.7.2",
"eslint-plugin-prettier": "^3.1.3",
"eslint-plugin-vue": "^7.0.0-0",
"html-webpack-plugin": "^3.2.0",
"prettier": "^1.19.1",
"typescript": "~3.9.3",
"uglifyjs-webpack-plugin": "^2.2.0",
"vue-jest": "^5.0.0-0",
"vue-loader": "^16.0.0-beta.8",
"webpack-cli": "^3.3.10",
"webpackbar": "^4.0.0"
}
}
配置文件
module.exports = {
ignore: [/\/core-js/],
presets: [
[
"@babel/preset-env",
{ modules: false, useBuiltIns: "usage", corejs: "3.6.5" },
],
],
overrides: [
{
test: "./node_modules",
sourceType: "unambiguous",
},
],
};
在html文件中使用我的组件
<div id="app">
<core-component-a></core-component-a>
</div>
浏览器中未呈现该组件。而是显示以下消息。
VM211871:1 [Vue warn]: Component provided template option but runtime compilation is not supported in this build of Vue. Use "vue.esm-browser.js" instead.
at <App>
3条答案
按热度按时间7uhlpewt1#
vue-loader * 将html模板转换为呈现函数,* 仅在SFC(单文件组件)-
.vue
文件(从Webpack配置中的vue规则可以看出)-和仅在SFC的<template></template>
块中提供的模板但是您的HTML文件中有一个模板-
<div id="app">
的内容实际上就是Vue模板。文档 *
vue.esm-bundler.js
:包括运行时编译器。如果您正在使用捆绑器但仍希望编译运行时模板(例如,DOM中的模板或通过内联JavaScript字符串-组件template
选项的模板),请使用此选项。*此外,如果您使用Webpack,则应使用Vue的“捆绑包”版本
Webpack.config.js
...您不需要切换minified/dev bundle,因为Webpack将以与您自己的代码相同的方式优化Vue代码(如果配置正确)。
另外,请注意文档中的这句话:* 使用
process.env.NODE_ENV
防护装置(必须由捆绑器替换)保留生产/开发分支 *NODE_ENV
通常用于定义环境类型,Vue使用它来决定要包含的代码...注意
我真的不明白为什么您要为使用Vue CLI创建的项目使用您自己的Webpack配置,而Vue CLI的全部功能是为您管理Webpack配置,并为customize it提供大量选项...这没有任何意义
tct7dpnv2#
您只需替换Webpack.config.js上的
与
这对我有用。
4c8rllxm3#
如果您使用的是Vite,请添加别名**'vue':'版本/分发/版本esm捆绑包'**到
vite.config.js