1. 程式人生 > >Failed to mount component: template or render function not defined. 錯誤的解決方法

Failed to mount component: template or render function not defined. 錯誤的解決方法

Vue.js 2 遇到 vue.runtime.common.js?d43f:511 [Vue warn]: Failed to mount component: template or render function not defined. (found in root instance) 錯誤的解決方法。

問題描述

先說一下每個檔案的內容。

package.json:

{
  "name": "test-typeof-vue",
  "version": "0.0.1",
  "main": "index.js",
  "license": "MIT",
  "scripts
": { "dev": "cross-env NODE_ENV=development webpack-dev-server --port 28080 --open --inline --hot", "build": "cross-env NODE_ENV=production webpack --progress --hide-modules" }, "devDependencies": { "babel-core": "6.18.2", "babel-loader": "6.2.8", "babel-preset-es2015": "6.18.0", "cross-env
": "3.1.3", "css-loader": "0.26.0", "file-loader": "0.9.0", "style-loader": "0.13.1", "vue-loader": "9.9.5", "webpack": "2.1.0-beta.27", "webpack-dev-server": "2.1.0-beta.11" }
, "dependencies": { "vue": "2.1.3" } }

webpack.config.js:

var path = require('path')
var webpack = require
('webpack') module.exports = { entry: './src/main.js', output: { path: path.resolve(__dirname, './dist'), publicPath: '/dist/', filename: 'build.js' }, module: { rules: [ { test: /\.css$/, use: [ { loader: 'style-loader' }, { loader: 'css-loader' } ] }, { test: /\.vue$/, loader: 'vue-loader', options: { // vue-loader options go here } }, { test: /\.js$/, loader: 'babel-loader', exclude: /node_modules/ }, { test: /\.(png|jpg|gif|svg)$/, loader: 'file-loader', options: { name: '[name].[ext]?[hash]' } } ] }, resolve: { alias: { } }, devServer: { historyApiFallback: true, noInfo: true }, devtool: '#eval-source-map', plugins: [ ] } if (process.env.NODE_ENV === 'production') { module.exports.devtool = '#source-map' // http://vue-loader.vuejs.org/en/workflow/production.html module.exports.plugins = (module.exports.plugins || []).concat([ new webpack.DefinePlugin({ 'process.env': { NODE_ENV: '"production"' } }), new webpack.optimize.UglifyJsPlugin({ compress: { warnings: false } }), new webpack.LoaderOptionsPlugin({ minimize: true }) ]) }

index.html:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>bmsclient</title>


  </head>
  <body>
    <div id="app"></div>
    <h1>aaaaaaaaaaaaaaaaaaaa</h1>

    <script src="/dist/build.js"></script>
  </body>
</html>

main.js:

import Vue from "vue";
new Vue({
    el: "#app"
});

最後在命令列專案資料夾下執行命令 npm run dev, 伺服器可以正常啟動,但是瀏覽器的控制檯列印錯誤資訊:

vue.runtime.common.js?d43f:511 [Vue warn]: Failed to mount component: template or render function not defined.
(found in root instance)

解決方法

import Vue from “vue”; 預設引入的檔案是 vue/dist/vue.runtime.common.js。這個讀者可以在node_modules/vue/package.json檔案裡面查到。package檔案的main選項指定了預設執行的檔案。關鍵的package.json程式碼如下:

"name": "vue",
"version": "2.1.3",
"description": "Reactive, component-oriented view layer for modern web interfaces.",
"main": "dist/vue.runtime.common.js",

讀者可以在github上閱讀vue.js 2.1.3的文件。文件位置在vue/dist/README.md。這個文件說明了 vue.runtime.common.js 檔案不含編譯器,因此不支援template選項。我們使用Webpack和template選項的話,可以使用vue.common.js檔案。vue.common.js檔案包含編譯器。所以main.js中把

import Vue from "vue";

改寫成

import Vue from "vue/dist/vue.common.js";

就可以了。而且可以正常使用 vue 檔案。

下面是在上面的程式碼基礎上,加上的使用vue檔案的例子:

index.html:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8"> <title>bmsclient</title>
  </head>
  <body>
    <div id="app">
      <hello></hello>
    </div>
    <h1>aaaaaaaaaaaaaaaaaaaa</h1>
    <script src="/dist/build.js"></script>
  </body>
</html>

main.js

import Vue from "vue/dist/vue.common.js";
import hello from "./hello.vue"
new Vue({
    el: "#app",
    components:{
        hello
    }
});

hello.vue

<template>
  <div>
    <h1>Hello</h1>
    <span>{{zca}}</span>
  </div>
</template>
<script>
export default {
  data:function(){
    return {
      zca: "zca"
    }
  },
  mounted:function() {
  }
}
</script>

<style></style>