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 ...
随机推荐
- CentOS7给终端配置快捷键【转发】
1.打开Applications,选择System Tools 2.选择Setting进入如下面界面,选择Keyboard 3.选择Keyboard,进入如下面界面,再点击Shortcuts 4.再点 ...
- 基于权限安全框架Shiro的登录验证功能实现
目前在企业级项目里做权限安全方面喜欢使用Apache开源的Shiro框架或者Spring框架的子框架Spring Security. Apache Shiro是一个强大且易用的Java安全框架,执行身 ...
- Postgres中的物化节点之sort节点
顾名思义,物化节点是一类可缓存元组的节点.在执行过程中,很多扩展的物理操作符需要首先获取所有的元组后才能进行操作(例如聚集函数操作.没有索引辅助的排序等),这时要用物化节点将元组缓存起来.下面列出了P ...
- mongodb设置用户名和密码
需求:我们需要在一个mongodb上面新建两个数据库,每个数据库的用户名和密码不一样,讲道理来说我们直接设置admin,就可以控制所有的数据库,不过用起来总是感觉有各种问题,目前还不太熟悉mongod ...
- 【JS】第一个js示例
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 【java】io流之字节输入流:java.io.InputStream类及子类java.io.FileInputStream
package 文件操作; import java.io.File; import java.io.FileInputStream; import java.io.IOException; impor ...
- 【python】type()、instance()
>>> a=520 >>> type(a) <class 'int'> >>> a=' >>> type(a) &l ...
- Vue.js(一)了解Vue
什么是Vue? 1.Vue.js是一个构建数据驱动的web界面的库.类似于Angularjs,在技术上,他重点集中在MVVM模式的View层,非常容易学习,非常容易和其他的库或已有的项目整合. 2.V ...
- PredictionIO+Universal Recommender快速开发部署推荐引擎的问题总结(2)
1, 对Universal Recommender进行pio build成功,但是却提示No engine found Building and delpoying model [INFO] [Eng ...
- php-迭代创建级联目录
方法一代码: path = './a/b/c/d/e/f'; $path_arr = explode('/',$path);//得到数组array('.','a','b','c','d','e','f ...