Vue前端路线执行与落地--新项目实施与落地篇

Vue.js is an awesome JavaScript Framework for building Frontend Applications! VueJS mixes the Best of Angular + React!

新项目基于vue技术路线的开发

运用到的工具、框架或库

  • VueJS 2.x
  • Vue-router
  • axios
  • Vuex
  • Element UI 2.x(PC端组件库)
  • VUX(移动端组件库)
  • Babel
  • Webpack 3
  • Npm

开发流程

  • 使用脚手架工具创建前端工程、后端工程,配置数据库,导入示例数据。

  • 根据项目实际需求,配置路由和菜单,准备各路由所对应的vue文件,vue文件内容为空白,待分配给项目成员实现。

  • 在mock目录下准备mock数据,设计好数据结构(控件需要的数据结构)和字段名(最好同数据库中表结构字段名)

  • 实现vue文件的界面部分,使用mockjs来拦截ajax请求,返回mock数据。

  • 后端实现RESTful接口,并维护接口文档(接口文档推荐使用markdown格式)

注意事项

  • JS风格使用ECMAScript 6编码风格,建议使用VSCode作为js/vue的编辑器,并安装以下插件EditorConfig for VSCode , Prettier-Standard - JavaScript formatter , JavaScript Standard Style , stylefmt , Vetur,注意不要再安装其他JS格式化工具以免冲突。

  • 并且vscode的配置里要加下面的命令,防止格式化时自动加分号。
    "prettier.singleQuote": true,
    "prettier.semi": false,

  • 在开发界面时使用ElementUI提供的栅格系统(24列),对界面进行响应式布局,以便移动端访问。

  • 不要使用ElementUI提供的图标组件,使用Font Awesome 图标。

  • 后端接口符合RESTful规范

  • 注意后端返回前端的数据,字段名同数据库中的字段名,并转为小写字母开头的驼峰式命名,构造mock数据时也要注意这一点。

  • 工程编译时,source目录下的lib、assets目录下的文件会被直接复制到dist目录下。

  • 不要提交node_modules和dist目录到svn工程里

  • 写接口的同事可维护markdown格式接口文档,并利用gitlab wiki功能编写接口文档

  • 为了便于维护,对话框、页签等如果里面的内容比较多(超过30行),要独立成vue组件,尽量不要让一个vue组件的代码太多(超过500行超过20K),尽量把vue文件里的js移到单独的文件,便于使用编辑器的js校验/js格式化功能。vue文件中css代码行数较多时(超过50行),亦可将css移到单独的css文件。模板部分要保持在vue文件里,以使用Vetur插件的模板语法校验功能。

  • 从后台请求的数据有分页的情况下,Request参数的约定:pageIndex 第几页(从第1页开始);pageSize 每页返回多少行。Response中返回数据除了有列表外,还要有total供分页条显示总记录数。特定的api也可以支持 startIndex 从第几行记录开始,count 返回多少行记录。

新项目基于vue技术路线的实施

多环境打包部署配置-测试环境

一般使用vue-cli脚手架创建的vue工程中都会有一个打包的配置目录build,其中对开发环境编译运行和生产环境打包做了相关配置,如果需要自定义测试环境的打包,我们把build.js复制一份,改名为bulid.test.js作为测试环境打包的总入口,同时复制一份webpack.prod.conf.js---->webpack.test.conf.js,修改成测试环境的相应配置即可。最后在config/index.js中增加如下配置:

 buildtest: {

    index:path.resolve(__dirname, '../dist/index.html'),

    assetsRoot:path.resolve(__dirname, '../dist'),

    assetsSubDirectory:'static',

    assetsPublicPath:'./',

    productionSourceMap:true,

    devtool:'#source-map',

    productionGzip:false,

    productionGzipExtensions: ['js', 'css'],

    bundleAnalyzerReport:process.env.npm_config_report

  },

这里对几个比较重要的配置做下说明:

  • assetsPublicPath:打包后引用的静态资源位置,这里使用的是相对路径,生产环境部署的时候如果需要把静态资源部署到cdn上,这个配置改为所在cdn的绝对路径即可。

  • productionSourceMap:打包以后是否保留源码map,测试环境为了调试方便,这里选择true,生产环境为了安全需要,建议配置成false。最终打包结果的区别在于是否有下图中的map文件

测试环境配置完成以后,在package.json的scripts对象中增加

"buildtest": "nodebuild/build.test.js"

然后就可以使用npmrun buildtest命令来进行测试环境的打包了。

打包静态资源问题

如果在打包的过程中想压缩资源文件,可以开启gzip压缩功能(config/index.js文件)

build: {
    // Template for index.html
    index: path.resolve(__dirname, '../dist/index.html'),

    // Paths
    assetsRoot: path.resolve(__dirname, '../dist'),
    assetsSubDirectory: 'static',
    assetsPublicPath: '/',

    /**
     * Source Maps
     */

    productionSourceMap: false,
    // https://webpack.js.org/configuration/devtool/#production
    devtool: '#source-map',

    // Gzip off by default as many popular static hosts such as
    // Surge or Netlify already gzip all static assets for you.
    // Before setting to `true`, make sure to:
    // npm install --save-dev compression-webpack-plugin
    productionGzip: true,
    productionGzipExtensions: ['js', 'css', 'jpg', 'png'],

    // Run the build command with an extra argument to
    // View the bundle analyzer report after build finishes:
    // `npm run build --report`
    // Set to `true` or `false` to always turn it on or off
    bundleAnalyzerReport: process.env.npm_config_report
  }

productionGzip:true|false,是否开始压缩功能,开启压缩功能之后, 打包出来的成果物要小很多.

IE兼容性问题

Vue官方文档有对IE兼容性的说明,因为 Vue 使用了IE8 无法模拟的 ECMAScript 5 特性。所以Vue不支持 IE8 及以下版本,它支持所有兼容ECMAScript 5 的浏览器。

在项目开发完成后,却出现了IE11无法访问的情况,具体报错信息:

SCRIPT5022: [vuex] vuex requires a Promisepolyfill inthis browser.

造成这种现象的原因归根究底就是浏览器对ES6中的promise无法支持,因此需要通过引入babel-polyfill来使我们的浏览器正常使用es6的功能,解决方案:

  • 首先通过npm来安装polyfill:
npm install babel-polyfill --save-dev
  • 修改webpack.base.conf.js文件module.exports的配置:
  entry: {

    app: ['babel-polyfill','./src/main.js']

  },

登录状态路由拦截

一般系统都会有对所有需要权限控制的路由进行拦截,确保登录状态下才能访问某些路由这类需求。利用vue-router提供的钩子函数beforeEach()可以很简单的实现。

  • 第一步:定义路由是否需要拦截

首先在定义路由的时候就需要多添加一个自定义字段requireAuth,用于判断该路由的访问是否需要登录。

{
    path:'/xxx,
    meta: {
      requireAuth:true, // 添加该字段,表示进入这个路由是需要登录的
    },
    component:xxx,
    redirect:'/xxx/xxx,
    children: [{
      meta: {
        requireAuth:true,

      },
      path:xxx/',
      component:xxx
    }
  }
  • 第二步:使用钩子函数beforeEach()拦截路由
// 全局导航钩子

router.beforeEach((to, from, next) => {

  if (to.meta.requireAuth) {
    getCurrentUser().then((curUser)=>{//getCurrentUser是封装的调用后台http接口的promise接口
      if (curUser) {
        next();
      } else {
        next({
          path:'/login',
          query: {
            redirect:to.fullPath //登录页面获取该参数,在重新登录后重定向到该路由
          }
        })
      }
    }).catch((err)=>{
      next({
        path:'/login',
        query: {
          redirect:to.fullPath
        }
      })
    }); 
  } else {
    next();
  }
  
})

每个钩子方法接收三个参数:

  • to: Route: 即将要进入的目标 路由对象

  • from: Route: 当前导航正要离开的路由

  • next: Function: 一定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数。

  • next(): 进行管道中的下一个钩子。如果全部钩子执行完了,则导航的状态就是 confirmed (确认的)。

  • next(false): 中断当前的导航。如果浏览器的 URL 改变了(可能是用户手动或者浏览器后退按钮),那么 URL 地址会重置到 from 路由对应的地址。

  • next(‘/’) 或者 next({ path: ‘/’ }): 跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容

  • 实用框架以及工具 UI组件[#UI%E7%BB%84%E4%BB%B6] 开发框架[#%E5%BC%80%E5%8...
    youins阅读 12,693评论 4 133
  • ## 框架和库的区别?> 框架(framework):一套完整的软件设计架构和**解决方案**。> > 库(lib...
    Rui_bdad阅读 2,857评论 1 4
  • 从开始准备到项目匹配成功 大概三个月的时间吧 中间一直断断续续熬夜抱着电脑坐在楼道里敲着键盘 接受面试 嗯 累...
    Jennifer_zn阅读 456评论 0 0
  • 车子稳稳地停好,我在后视镜里仔细端详了一下自己,头发不乱,衣服上没沾上丝毫味道。一切正常!仔细检查过手机通...
    慢煮生活阅读 3,384评论 19 11