【问题标题】:[Vue warn]: Failed to mount component: template or render function not defined in Webpack 4[Vue 警告]:无法挂载组件:Webpack 4 中未定义模板或渲染函数
【发布时间】:2019-05-25 19:03:14
【问题描述】:

我在升级到 Webpack 和相关依赖项到 v4 后开始收到此错误:[Vue warn]: Failed to mount component: template or render function not defined.

这是我的package.jsonwebpack.config.js前后的相关sn-ps:

升级前:

package.json

{
  "dependencies": {
    "vue": "^2.5.0",
    "vue-template-compiler": "^2.5.0"
  },
  "devDependencies": {
    "babel-core": "^6.9.0",
    "babel-loader": "^6.2.4",
    "babel-plugin-external-helpers": "^6.22.0",
    "babel-plugin-transform-es2015-block-scoping": "^6.26.0",
    "babel-plugin-transform-object-rest-spread": "^6.26.0",
    "babel-plugin-transform-runtime": "^6.23.0",
    "babel-preset-env": "^1.6.1",
    "babel-preset-es2015": "^6.9.0",
    "babel-preset-es2015-without-strict": "^0.0.4",
    "babel-preset-es2017": "^6.24.1",
    "babel-preset-latest": "^6.24.1",
    "css-loader": "^0.26.0",
    "eslint": "^4.3.0",
    "husky": "^0.14.3",
    "lint-staged": "^4.0.2",
    "resolve-url-loader": "^1.6.0",
    "sass-loader": "^4.0.1",
    "stats-webpack-plugin": "^0.2.1",
    "style-loader": "^0.13.1",
    "uglifyjs-webpack-plugin": "^1.1.6",
    "vue-loader": "^12.1.0",
    "webpack": "3.10.0",
    "webpack-dev-server": "^2.3.0",
    "webpack-monitor": "^1.0.13"
  }
}

webpack.config.js

 {
  resolve: {
    modules: [
      path.join(__dirname, '..', 'webpack'),
      'node_modules/'
    ],
    alias: {
      vue: process.env.NODE_ENV === 'production' ? 'vue/dist/vue.min.js' : 'vue/dist/vue.js',
      libs: 'libs/'
    }
  },

  plugins: [
    new StatsPlugin('manifest.json', {
      chunkModules: false,
      source: false,
      chunks: false,
      modules: false,
      assets: true
    })],
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: [
          {
            loader: 'babel-loader',
            options: {
              cacheDirectory: true,
              presets: ['es2015']
            }
          }
        ]
      }, {
        test: /\.vue$/,
        exclude: /node_modules/,
        use: [
          {
            loader: 'vue-loader'
          }
        ]
      },
      {
        test: /\.js$/,
        include: [
          path.resolve(process.cwd(), 'node_modules/')
        ],
        use: [
          {
            loader: 'babel-loader',
            options: {
              plugins: ['transform-es2015-block-scoping'],
              cacheDirectory: true
            }
          }
        ],
      },
    ]
  }
};

升级后:

package.json

{
  "dependencies": {
    "vue": "^2.5.13",
    "vue-template-compiler": "^2.5.13"
  },
  "devDependencies": {
    "babel-core": "^6.26.0",
    "babel-loader": "^7.1.3",
    "babel-plugin-external-helpers": "^6.22.0",
    "babel-preset-env": "^1.6.1",
    "babel-preset-latest": "^6.24.1",
    "css-loader": "^0.26.0",
    "eslint": "^4.3.0",
    "husky": "^0.14.3",
    "lint-staged": "^4.0.2",
    "resolve-url-loader": "^1.6.0",
    "sass-loader": "^4.0.1",
    "stats-webpack-plugin": "^0.2.1",
    "style-loader": "^0.13.1",
    "uglifyjs-webpack-plugin": "^1.1.6",
    "vue-loader": "^14.1.1",
    "webpack": "^4.0.1",
    "webpack-cli": "^2.0.9",
    "webpack-dev-server": "^3.0.0",
    "webpack-monitor": "^1.0.13"
  }
}

webpack.config.js

{
  resolve: {
    modules: [
      path.join(__dirname, '..', 'webpack'),
      'node_modules/'
    ],
    alias: {
      vue: process.env.NODE_ENV === 'production' ? 'vue/dist/vue.min.js' : 'vue/dist/vue.js',
      libs: 'libs/'
    }
  },

  plugins: [
    new StatsPlugin('manifest.json', {
      chunkModules: false,
      source: false,
      chunks: false,
      modules: false,
      assets: true
    })],
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: [
          {
            loader: 'babel-loader',
            options: {
              cacheDirectory: true
            }
          }
        ]
      }, {
        test: /\.vue$/,
        exclude: /node_modules/,
        use: [
          {
            loader: 'vue-loader'
          }
        ]
      },
      {
        test: /\.js$/,
        include: [
          path.resolve(process.cwd(), 'node_modules/')
        ],
        use: [
          {
            loader: 'babel-loader',
            options: {
              cacheDirectory: true
            }
          }
        ],
      },
    ]
  }
};

预期是什么?

Vue 组件升级后可以正常工作

实际发生了什么?

大多数 Vue 组件显示错误并无法加载:[Vue warn]: Failed to mount component: template or render function not defined.

【问题讨论】:

  • 您能展示一下您是如何导入组件的吗?你在做异步/动态导入吗?
  • @skribe 哦,你的问题帮助我解决了这个问题!基本上我是在声明这样的组件:Vue.component('thing', require('libs/components/thing.vue')); 我不得不将其更改为Vue.component('thing', require('libs/components/thing.vue').default);
  • 太棒了!很高兴它有帮助。

标签: webpack vuejs2 vue-component vue-loader webpack-4


【解决方案1】:

想通了(h/t @skribe)。基本上我是在声明这样的组件:

Vue.component('thing', require('libs/components/thing.vue'));

我不得不将其更改为:

Vue.component('thing', require('libs/components/thing.vue').default);

【讨论】:

  • 其他说明。根据 vue-loader v13 的发行说明,有时也需要以不同方式处理导入 const Foo = () => import('./Foo.vue').then(m => m.default) github.com/vuejs/vue-loader/releases/tag/v13.0.0
  • 你拯救了我的一天。不过很奇怪。它对我有用.. 你能告诉你为什么必须添加 .default 的原因吗?
  • @santanubera 很高兴能帮上忙!对我来说,这是因为新版本的 Webpack 不再隐式使用包的默认导出。您现在必须明确告诉它使用默认值。
  • 非常感谢@jesal
  • 这确实有效,可以确认我在更新到 webpack 4 后遇到了同样的问题
猜你喜欢
  • 2021-03-19
  • 2018-03-01
  • 2018-12-20
  • 2018-10-16
  • 2017-06-01
  • 2019-08-30
  • 2019-09-21
  • 2017-10-20
相关资源
最近更新 更多