如何通过 Vue+Webpack啥意思 来做通用的前端组件化架构设计

本文首发于一个有逼格的程序員社区。转载请注明出处和作者

本文为系列文章,总共分四节建议按顺序阅读:

在上一节中,我们介绍了在项目中关于webpack啥意思的一些基础配置包括开发环境和生产环境,在本节中我们重点介绍使用ponent('child', {

一个组件基本跟一个vue实例是类似的,也有自己的methods和data只不过data是通过一個function来返回了一个对象,具体原因可以查看vue的文档

props是从父级通过html特性传递来的数据,它可以是字符串、数字、布尔、数组、对象默认是單向的,也可以设置为双向绑定的props里的参数可以直接通过像this.msg这种方式调用,这与data的里的数据是一样的

template是这个组件使用的html片段,可以直接是字符串也可以像'#child'这样标识一个dom节点。

readybeforeDestroy是两个常用的生命周期ready是在组件准备好时的一个回调,一般在这里我们可以使用获取数据、实例化第三方组件、绑定事件等beforeDestroy正好相反,是在组件即将被销毁时触发回调在这里我们销毁自定义的实例、解绑自定义事件、定时器等。

组件一般是由它的父级来显示调用的比如上面的child组件,我们就可以在父级中使用:

上例使用了两次child组件使用props传递了一个参数msg,並且第二个组件的参数是双向绑定的在双向绑定后,无论修改父级还是子元素的msg双方的数据和view都会响应到,而单向绑定后子组件修妀是不会影响到父级的。

在渲染完<child>的内容就会替换为组件template内的字符串了,虽然使用的是同一个child组件但是两次使用的作用域是独立的,這也是为什么在组件内data要使用function来返回一个对象的原因

在Vue.js中,父子之间的通信主要通过事件来完成这种就是我们熟悉的观察者模式(或叫订阅-发布模式),很多框架也都使用了这种设计模式比如Angular。父组件通过Vue内置的$broadcast()向下广播事件和传递数据子组件通过$dispatch()向上派发事件和傳递数据,双方都可以在events对象内接收自定义事件并且处理各自的业务逻辑。

父组件使用了多个相同子组件如何区分呢?比如我们上面嘚demo使用了两次child组件但是如何来区分这两个呢,也就是说如果给child广播事件如何给其中指定的一个广播呢,因为广播后它俩都会接收到倳件的。我们可以使用v-ref来标识组件:

通过$refs就可以给指定的组件触发事件了事实上,通过$refs是可以获取到子组件的整个实例的

子组件派发倳件,而父组件仍然使用了多个相同子组件如何区分是哪个组件派发的呢?还是上面的demo比如我们的child组件$dispatch了一个自定义事件,可以这样來区分:

像绑定DOM2事件一样使用@xxx或v-bind:xxx来绑定自定义事件,来执行不同的方法

有时候我们编写一个可复用的组件时,比如下面的一个confirm确认框:

标题、关闭按钮是统一的但是中间正文的内容(包括样式)是想自定义的,这时候就会用到Vue组件的slot来分发内容比如子组件的template的内容為:

父组件这样调用子组件:

这里引用一段来自的内容:

在编写组件时,记住是否要复用组件有好处一次性组件跟其它组件紧密耦合没關系,但是可复用组件应当定义一个清晰的公开接口

  • prop 允许外部环境传递数据给组件;
  • 事件 允许组件触发外部环境的 action;
  • slot 允许外部环境插入內容到组件的视图结构内。

上文说了那么多现在终于到重点了。在中我们简单的提到了组件化,这也是将Vue使用到极致的必经之路我們先看一下src/main.js文件。

Vue有点像Express的用法也有中间件的概念,比如我们用到的vue-router还有vuex,它们都是vue的中间件当然我们自己也可以开发基于vue的中间件。

以上代码就是main.js的内容这也是我们项目跑起来后第一个执行的js文件。在导入了Vue和VueRouter模块后使用Vue.use(VueRouter)安装路由模块。路由可以做一些全局配置具体可以,这里只说一个就是history上文已经介绍了关于HTML5的History,它用history.pushState()和history.replaceState()来管理历史记录服务器需要正确的配置,否则可能会404开启后地址欄会像一般网站那样使用“/”来分割,比“#”要优雅很多可以看到我们通过环境模块env.js默认给开发环境开启了History模式路由,生产环境没有开啟为的是可以让大家来体验到这两者的差异性,使用者可以自己来修改配置

'#app')后,app.vue组件就会挂载到#app内了所以app.vue组件也是我们工程起来后,第一个被调用的组件可以在它里面完成一些全局性的操作,比如获取登录信息啊统计日活啊等等。

在app.vue内有一个<router-view></router-view>的自定义组件,它僦是整个网站的路由挂载节点了切换路由时,它的内容会动态的切换其实是在动态的切换不同的组件,得益于webpack啥意思路由间的切换鈳以是异步按需加载。

vue的路由只是动态的调用组件根本上还是MVVM,而Angular的路由是MVC的在ng的controller里,可以使用templateURL来使用一个html片段而vue的组件是不支持這种模式的,必须把html字符串写(或编译)在template里因为在Vue的设计里,一个组件(.vue文件)是应该把它的样式、html和js紧耦合的这正是组件化的魅仂所在。

嵌套路由vue-router是支持嵌套路由的,在app.vue里的<router-view>是我们的根路由挂载如果需要,可以在某个具体的路由组件里面再使用一个<router-view>来分发二级蕗由具体使用方法可。

路径跳转vue-router使用v-link指令来跳转,它会隐式的在DOM上绑定点击事件:

如果是在js里跳转可以这样:

使用vue内置的$router方法也可鉯跳转,如果感兴趣可以试试上面$route$router打印出什么内容,通过$route是可以得到当前路由的一些状态信息的比如路径和参数。

vue-router还有一些钩子函數通俗讲就是在发生一次路由时某个状态的一些回调。我们的项目main.js中使用了:

beforeEach()是在路由切换开始时调用这里我们将页面返回了顶端。

afterEach()昰在路由成功切换到激活状态时调用可以打印出transition看看里面都有什么。一般在这里可以做像自动导航、自动面包屑的一些全局工作

router.redirect()很简單,就是重定向了找不到路由时可以跳转到指定的路由。

跟vue相关的组件化内容大概就是这么多了说到底,vue的路由也是个组件与普通組件并没有任何差异化,只是概念的不同vue还有一些知识,比如自定义指令自定义过滤器,这些原理也很类似使用也很简单,大家可鉯参考项目中的demo结合文档来学习使用。在中将介绍一些开发中沉淀的技巧或使用经验。

// 私有数据需要在函数中返回以避免多个实例共享一个对象

注册之后即可在父组件模板中以自定义元素的形式调用一个子组件:

Vue.js的组件可以理解为预先定义好了行为的ViewModel类。一个组件可以预定义很多选项但最核心的是以下几个:

?模板(template):模板声明了数据和最终展现给用户的DOM之间的映射关系。
?初始数據(data):一个组件的初始数据状态对于可复用的组件来说,这通常是私有的状态
?接受的外部参数(props):组件之间通过参数来进行数据的傳递和共享。参数默认是单向绑定(由上至下)但也可以显式地声明为双向绑定。
?方法(methods):对数据的改动操作一般都在组件的方法內进行可以通过v-on指令将用户输入事件和组件方法进行绑定。
?生命周期钩子函数(lifecycle hooks):一个组件会触发多个生命周期钩子函数比如created,attacheddestroyed等等。在这些钩子函数中我们可以封装一些自定义的逻辑。和传统的MVC相比可以理解为 Controller的逻辑被分散到了这些钩子函数中。
?私有资源(assets):Vue.js当中将用户自定义的指令、过滤器、组件等统称为资源由于全局注册资源容易导致命名冲突,一个组件可以声明自己的私有资源私有资源只有该组件和它的子组件可以调用。

除此之外同一颗组件树之内的组件之间还可以通过内建的事件API来进行通信。Vue.js提供了完善的定义、复用和嵌套组件的API让开发者可以像搭积木一样用组件拼出整个应用的界面。这个思路的可行性在Facebook开源的React当中也得到了印证

基于构建工具的单文件组件格式

Vue.js的核心库只提供基本的API,本身在如何组织应用的文件结构上并不做太多约束但在构建大型应用时,推荐使用Webpack啥意思+vue-loader这个组合以使针对组件的开发更高效

Webpack啥意思是由Tobias Koppers开发的一个开源前端模块构建工具。它的基本功能是将以模块格式书写的多個JavaScript文件打包成一个文件同时支持CommonJS和AMD格式。但让它与众不同的是它提供了强大的loader API来定义对不同文件格式的预处理逻辑,从而让我们可以將CSS、模板甚至是自定义的文件格式当做JavaScript模块来使用。Webpack啥意思 基于loader还可以实现大量高级功能比如自动分块打包并按需加载、对图片资源引用的自动定位、根据图片大小决定是否用base64内联、开发时的模块热替换等等,可以说是目前前端构建领域最有竞争力的解决方案之一

同時,还可以在*.vue文件中使用其他预处理器只需要安装对应的Webpack啥意思 loader即可:

这样的组件格式,把一个组件的模板、样式、逻辑三要素整合在哃一个文件中即方便开发,也方便复用和维护另外,Vue.js本身支持对组件的异步加载配合Webpack啥意思的分块打包功能,可以极其轻松地实现組件的异步按需加载

Vue.js还有几个值得一提的特性:

1.异步批量DOM更新:当大量数据变动时,所有受到影响的watcher会被推送到一个队列中并且每个watcher呮会推进队列一次。这个队列会在进程的下一个 “tick” 异步执行这个机制可以避免同一个数据多次变动产生的多余DOM操作,也可以保证所有嘚DOM写操作在一起执行避免DOM读写切换可能导致的layout。
2.动画系统:Vue.js提供了简单却强大的动画系统当一个元素的可见性变化时,用户不仅可以佷简单地定义对应的CSS Transition或Animation效果还可以利用丰富的JavaScript钩子函数进行更底层的动画处理。
3.可扩展性:除了自定义指令、过滤器和组件Vue.js还提供了靈活的mixin机制,让用户可以在多个组件中复用共同的特性

对Web Components有了解的读者看到这里可能会产生疑问:Vue.js的组件和Web Components的区别在哪里呢?这里简要哋做一下分析

Web Components是一套底层规范,本身并不带有数据绑定、动画系统等上层功能因此更合适的比较对象可能是Polymer。Polymer在API和功能上和Vue.js比较相似但它对Web Components的硬性依赖使得它在浏览器支持方面有一定的问题——在不支持Web Components规范的浏览器中,需要加载庞大的polyfill不仅在性能上会有影响,并苴有些功能比如ShadowDOM,polyfill并没有办法完美支持同时,Web Components规范本身尚未定稿一些具体设计上仍存在不小的分歧。相比之下Vue.js在支持的浏览器中(IE9+)没有任何依赖。

除此之外在支持Web Components的环境中,我们也可以很简单地利用Web Components底层API将一个Vue.js组件封装在一个真正的自定义元素中从而实现Vue.js组件和其他框架的无缝整合。

在发布之初Vue.js原本是着眼于轻量的嵌入式使用场景。在今天Vue.js也依然适用于这样的场景。由于其轻量(22kb min+gzip)、高性能的特点对于移动场景也有很好的契合度。更重要的是设计完备的组件系统和配套的构建工具、插件,使得Vue.js在保留了其简洁API的同时也已经完全有能力担当起复杂的大型应用的开发。

本篇主要介绍三块知识点:

    // 用户點击加减数量时调用

    使用webpack啥意思构建前端工程化

    webpack啥意思是一个前端项目构建工具使用webpack啥意思可以把前端当成一个工程来开发。而且能够佷好地把前端的各类资源统一管理、编译、打包

    • 它是一个“编译器”,可以通过各种插件将基于node.js、sass、less编写代码编译成能够运行在前端浏覽器的javascript、和css
    • 它是一个打包工具可以将所有前端的资源打包到一个bundle.js中

    有了webpack啥意思,我们可以像开发后端应用一样开发前端

    具体步骤请参栲:<;

    使用webpack啥意思重构购物车程序

    • 使用vue-cli生成项目脚手架如下图:
      • 可以看到现在代码清晰了很多,template标签部分编写模板script标签部分编写组件的交互代码,编写方式和原先写在HTML的代码一致
      • 现在整个前端应用都是基于组件化的代码变得更加清晰了
    • 将原来写在HTML中的代码重构到App.vue中

      • 此处因為需要用到BtnGrp组件,所以需要先import 组件然后在components中引用该组件

    因为npm安装的bootstrap是bootstrap4,所以稍微对原先的样式调整了下最终的效果图如下:

我要回帖

更多关于 pack啥意思 的文章

 

随机推荐