Webpack+vue2.0如何注册全局组件 (01)
Part 1, 问题: webpack + vue2.0框架中,如何在入口js中注册组件?
就是在一个月以前,匆匆闯入vuejs这个社群,基本了解了vuejs的一些基础特性和语法。笔者兴致勃勃地开始想用vuejs写个单页面应用出来。兜兜转转地开始使用vue-router这个插件,阅读了vue-router前两个事例之后,发现了一个问题。
通过webpack导入.vue的组件文件的时候,弹出问题:
[vue warn]: Failed to mount component:template or render function not defined.

这个只问题出现在vue2.0中,搜索了一下相关资料,网友的解答给了笔者一点启发:传送门
@byronlun的回答:
于是乎,按照官方文档的说法,在webpack配置中加入上面那段代码之后,就不报错了,不过我的页面还是一片空白:<
实在没办法继续Google,然后在Github看到了这个issue里面的LinusBorg的评论,在index.js文件这里,只能使用下列两种情况:
使用template属性例如:template:'<div><modal> ... </modal></div>'
使用render() function
因此,通过测试,可以直接使用template:'<div><modal> ... </modal></div>来加载对应的内容,组件的话,则需使用render function来注册子组件。
修改之后的index.js文件应该是这样:
var Vue = require('vue');
import App from './vue/app';
new Vue({
el: '.show',
render: (createElement) => createElement(App)
});
本人愚见(错误请指出):特别注意一点在入口js文件这里,是无法使用components属性来注册子组件的,而在组件中则可以使用components属性来注册子组件。如果在你的App.vue中,使用components属性来注册子组件的话是可以注册成功的。这是vue2.0才会出现的问题,如果是1.0是不会出现这个问题的。
Part 2,解决的方法
网友byronlun的回答,有一定的正确性。在使用webpack构建前端应用时通过
import [component_name] from "\views\component_name.vue"
的方法载入的实例无法直接使用全局变量注册组件Vue.component()。
但是使用webpack构建的语法,import方法导入的实例拥有多个方法,列如在vue webpack工程中修改如下代码:
App.vue中
<template>
<div id="app">
<router-link to="/"><img src="./assets/logo.png"></router-link>
<navbar></navbar> <!-- 添加自定义组件-->
<nav>
<router-link to="/user/peng/profile">Go to user profile</router-link>
<router-link to="/user/hu/posts">Go to user posts</router-link>
</nav>
<router-view/>
</div>
</template>
入口main.js
// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import router from './router'
import navbar from '@/components/Navbar.vue'
Vue.config.productionTip = false
// 以下是注册组件的方法
Vue.component('navbar', {
render: navbar.render,
data: navbar.data
})
/* eslint-disable no-new */
new Vue({
el: '#app',
router,
template: '<App/>',
components: { App }
})
组件Navbar.vue
<template>
<div class="test">
{{msg}}
</div>
</template>
<script>
export default {
name: 'navbar',
data () {
return {
msg: 'Welcome to Your Vue.js App'
}
}
}
</script>
Part 3, 组件加载的原理
在查看navbar实例,我们发现render:f() 和 data: f data()两个方法。也就是说,webpack的解析会将.vue文件中的模板和数据编译成为render、data和其他方法。

通过这两个方法,可以对组件进行初始化。所以在入口js文件注册组件时,我添加了两个初始化方法
Vue.component('navbar', {
render: navbar.render,
data: navbar.data
})
最后的效果如下,

Part 4, 后续研究
在网上看到,webpack在解析的时候还可以将.vue文件中的css和js模块载入进来,需要配置sass和lass。这方面的研究还没开始。笔者在这里先留个坑!!!
后记,
新年第一周的技术文档以拖延一天的结果展示出来,有些说不过去,这里反省一下。对于这篇文章,希望对新学习vue的网友有所帮助,当然也希望路过这里的技术高人提供宝贵意见。
谢谢大家,祝大家新年快乐!(这个祝福有点晚!!!)
Webpack+vue2.0如何注册全局组件 (01)的更多相关文章
- vue 注册全局组件
注册全局组件有啥好处呢? 提高代码的复用性:哪里需要写哪里,贼方便,就写一个标签:减少代码量:可以再配合slot一起使用,咦~~,舒服 为了让整个项目的可读性,我创建一个文件统一存放全局组件 1.创建 ...
- vue 中注册全局组件
1 全局注册组件 建一个 js 文件, 注册全局组件, 并且暴露出去 然后再在 main.js 中引入 在页面就可以直接使用了 2 全局注册过滤器 建立文件, 包含所有过滤器方法 ...
- vue 自动注册全局组件
vue 自动注册全局组件 vue 注册全局组件的方式 const plugins = { install(Vue) { const requireComponent = require.context ...
- vue2.0的瀑布流组件-使用说明
做一个小项目,需要瀑布流,就选他了,先看看效果 使用瀑布流布局组件:vue-waterfall-easy 下载引入: 方式一:直接从git上复制组件的完整代码,引入vue组件文件即可 import v ...
- VUE注册全局组件和局部组件
全局组件 第一步:在components文件夹下建立一个子文件Users.vue <template> <div class="users"> {{msg} ...
- Vue2.0表单校验组件vee-validate的使用
vee-validate使用教程 *本文适合有一定Vue2.0基础的同学参考,根据项目的实际情况来使用,关于Vue的使用不做多余解释.本人也是一边学习一边使用,如果错误之处敬请批评指出* 一.安装 n ...
- Vue2.0的变化 ,组件模板,生命周期,循环,自定义键盘指令,过滤器
组件模板: 之前: <template> <h3>我是组件</h3><strong>我是加粗标签</strong> </templat ...
- Vue2.0中的transition组件
组件的过度 Vue1.0中transition做为标签的行内属性被vue支持.但在Vue2.0中.Vue放弃了旧属性的支持并提供了transition组件,transition做为标签被使用. 使用t ...
- 在vue2.0中引用element-ui组件库
element-ui是由饿了么团队开发的一套基于 Vue 2.0 的桌面端组件库. 官网:http://element.eleme.io/ 安装 npm i element-ui -S 引用完整的el ...
随机推荐
- Java项目中使用Redis缓存案例
缓存的目的是为了提高系统的性能,缓存中的数据主要有两种: 1.热点数据.我们将经常访问到的数据放在缓存中,降低数据库I/O,同时因为缓存的数据的高速查询,加快整个系统的响应速度,也在一定程度上提高并发 ...
- SQL Server AlwaysOn添加监听器失败
标签:MSSQL/ 一.错误描述 1.群集服务未能使群集服务或应用程序“Alwayson22”完全联机或脱机.一个或多个资源可能处于失败状态.这可能会影响群集服务或应用程序的可用性 2.群集服务中的群 ...
- 使用puppet
首先配置一个默认文件 只是首次创建的时候才需要重启,后期不需要重启! [root@master manifests]# vim /etc/puppet/manifests/site.pp node d ...
- mac下配置caffe
Step1:安装homebrew 如果电脑上有,暂时不装.但是在step2(或者其他需要brew的情况)加完sudo之后如果仍然报错,就需要重新安装homebrew.在终端里输入如下命令: ruby ...
- lua 实现tableToString
function tableToString(studentNum) local str = "{ " str = str.."\n" for k, v in ...
- 【WebGL】《WebGL编程指南》读书笔记——第4章
一.前言 今天继续第四章的学习内容,开始学习复合变换的知识. 二.正文 Example1: 复合变换 在书中,作者为我们封装了一套用于变换的矩阵对象:Matrix4对象.它 ...
- String 转化成java.sql.Date和java.sql.Time
String类型转换成java.sql.Date类型不能直接进行转换,首先要将String转换成java.util.Date,在转化成java.sql.Date 请点击---> java架构 ...
- 微信公众号H5支付遇到的那些坑
简史 官方文档说的很清楚,商户已有H5商城网站,用户通过消息或扫描二维码在微信内打开网页时,可以调用微信支付完成下单购买的流程. 当然,最近微信支付平台也加入了纯H5支付,也就是说用户可以在微信以外的 ...
- Java设计模式之(一)------单例模式
1.什么是单例模式? 采取一定的办法保证在整个软件系统中,单例模式确保对于某个类只能存在一个实例.有如下三个特点: ①.单例类只能有一个实例 ②.单例类必须自己创建自己的实例 ③.单例类必须提供外界获 ...
- 自定义php错误异常处理
set_exception_handler() 函数设置用户自定义的异常处理函数. 该函数用于创建运行时期间的用户自己的异常处理方法. 该函数会返回旧的异常处理程序,若失败,则返回 null. set ...