Vue+webpack单页应用及多页应用实现
项目背景
最近做了两个vue的项目,一个是商城供货商端,做的是vue单页;另一个是商城用户端,做的是vue多页。事实上,现在的前端框架如angular,react,vue等的出现都是服务于web应用的,一般的实践也都是做spa。但是考虑到商城页面较多,图片较多,如果spa,可能占用内存过高,另外观察京东,淘宝web版本,也都是多页实现。所以还是选多页吧。
在这里忍不住要赞下vue。语法清晰简单;我之前也用过angular1,相比之下,vue的轻量化的组件化开发,模板渲染,单文件编写,丰富的生命周期hook,完善的文档;让人写起代码来都很爽,可以看作是吸收了angular和react的优点。如果是小的web应用或者是小的团队开发,我肯定优先选择vue。
供货商端单页实现
先看下目录结构和最终的效果图:
项目链接:http://saas-1014-100001.m.izhuazhua.com/appProducer/producerIndex.jsp
webpack代码如下:
entry指定入口文件是src/main.js。生成的build.js文件到static目录下。loader中看下使用到了vue-loader来处理.vue结尾的文件。A .vue file is a custom file format that uses HTML-like syntax to describe a Vue component. Each .vue file consists of three types of top-level language blocks: , and 。本次项目所有的component都是采用这种单文件.vue的形式编写的,这也是官方推荐的,简洁直观。
而vue-loader就是为解析vue文件的loader,它有如下几个功能:
- ES2015 enabled by default;(自动支持es2015语法)
- Allows using other Webpack loaders for each part of a Vue component, for example SASS for and as module dependencies and handle them with Webpack loaders;(将style和template作为模块)
- Can simulate scoped CSS for each component;(能够支持组件内样式,其实就是使用了属性选择器。对于每个class生成一个唯一的attr值。.goods_item[_v-6a5a53f4] 然后以的方式添加样式)
- Supports component hot-reloading during development.(开发阶段支持组件的热加载)
我们看下入口文件main.js
这里在main.js中创建了一个路由器模块router,并且配置了路由信息。在App.vue组件中有router-view作为容器,匹配到的页面会渲染在其中。vue-router的详细介绍在这里
路由组件都很相似,vue-router就和angular的ui-router很接近。而且vue-router还提供了滚动位置的保持,省去了很多事情。总的来说vue单页应用其实上手很简单,而且vue官方还提供了脚手架工具vue-cli。连webpack的配置都可以自动完成。
商城多页实现
先看下目录结构和最终的效果图:
项目链接:
- http://saas-1014-100001.m.izhuazhua.com/appMarket/dist/home.jsp
- http://saas-1014-100001.m.izhuazhua.com/appMarket/dist/orders.jsp
多页下比较麻烦,首先webpack entry需要设置多个。这里设置的是container下的所有js作为入口js;在getEntry中使用到了node的glob模块,这个模块可以通过编写一个正则来匹配筛选文件。glob匹配文件的操作一般是异步的,但这里采用sync匹配。sync的返回值是一个文件的列表。module.exports.out的设置也因为测试环境很正式环境有所不同:
- development环境中采用的是HtmlWebpackPlugin生成多个页面。
- production环境由于最终页面使用的是jsp而不是html,所以HtmlWebpackPlugin插件自然没有效果,采用自己编写plugin,在回调中通过stats.toJson().assetsByChunkName;可以获取到js chunk带上hash之后的filename,再通过node原生fs模块,对src/下的jsp文件处理,替换hash之后的js url。生成新的jsp文件到dist中。
这就是大概的思路。
|
|
整体就是这样,每个页面都有一个主component渲染页面,而这个主要的component又是由很多小的component组成。