详解vue项目构建与实战


Posted in Javascript onJune 27, 2017

前言

由于vue相对来说比较平缓的学习过程和新颖的技术思路,使其受到了广大前后端开发者的青睐,同时其通俗易懂的API和数据绑定的功能也为其揽获了不少用户。本文主要讲解vue项目的构建与实战,因此不会太多涉及其API和语法部分,旨在帮助vue的入门级用户了解从零开始构建vue项目的步骤和方法。

vue项目分类

详解vue项目构建与实战

首先,在构建一个vue项目之前我们需要了解vue项目的分类,这里我主要将其分为两类:(1)直接引入vue.js文件 (2)使用vue单文件组件

按以上两类来看,直接引入vue.js文件就像页面中直接引入jQuery一样,这样的项目存在很多缺陷,只能使用一些基础的API和局限的功能,一般主要用于初级用户和小型项目。本文主要讲解第二种使用vue但文件组件构建的vue项目。

构建方式

详解vue项目构建与实战

构建一个vue项目存在着多种方式,首先我们需要用到相应的构建工具。官方推荐的构建工具主要有webpack和browserify,这里我更推荐大家使用webpack进行构建。同时除了构建工具,我们还需要用到构建方法,比如我们可以使用vue-cli脚手架来自动生成vue项目的基础目录文件,当然我们也可以从零开始进行自定义构建。

vue-cli构建

如果你使用vue-cli脚手架来构建vue项目,那么你只需敲击下面5行命令即可生成一个简单的vue项目(前提安装node.js):

npm install -g vue-cli

vue init webpack my-project

cd my-project

npm install

npm run dev

如此一个基础的vue项目目录就自动会展现在你面前,我们可以来看一下其自动生成的基础文件:

├── build // webpack/node配置文件
│ ├── build.js
│ ├── check-versions.js
│ ├── dev-client.js
│ ├── dev-server.js
│ ├── utils.js
│ ├── vue-loader.conf.js
│ ├── webpack.base.conf.js
│ ├── webpack.dev.conf.js
│ └── webpack.prod.conf.js
├── config // 环境配置文件
│ ├── dev.env.js
│ ├── index.js
│ └── prod.env.js
├── node_modules // npm包文件
├── src // 静态资源文件
│ ├── assets
│ │ └── logo.png
│ ├── components 
│ │ └── Hello.vue 
│ ├── router
│ │ └── index.js 
│ ├── App.vue 
│ └── main.js
├── static
├── .babelrc // babel配置文件
├── .gitignore // gitignore忽略文件
├── .editorconfig // 编码风格配置文件
├── .postcssrc.js // postcss配置文件
├── package.json // node包管理文件
├── index.html // 首页模板
├── package.json // 包管理文件
└── README.md // 描述文件

这样的构建方式其实并不适用于所有项目,很多文件你的项目可能都不会用到,并且如果你对自动生成的文件一无所知,那么后期维护起来也会非常的吃力。所以这里不推荐新手使用vue-cli构建,而是推荐大家参考vue-cli生成的文件从零开始构建一个vue项目。

自定义构建

相比vue-cli构建,自定义构建就显得灵活得多,但是它需要你了解构建的步骤和原理,要求也就随之提高了。自定义构建分为以下几步:

  1. 文件/文件夹创建
  2. package.json文件创建
  3. webpack配置文件创建
  4. 入口文件创建
  5. vue组件编写
  6. 路由配置

1. 文件/文件夹创建

详解vue项目构建与实战

按照上方的图示,我们需要从零开始创建以上文件和文件夹,每一个文件都有其自己的用途。

2. package.json文件

使用下方命令,我们可以快速创建一个package.json文件:

npm init -y

然后修改其scripts配置项,添加打包压缩命令,并且增加dependencies依赖项,添加项目相应依赖,这里我们主要依赖了vue和vue-router(完整package.json配置文件见最后实例源码):

...

"scripts": {
 "build": "rimraf dist && cross-env NODE_ENV=prod&&webpack -p --config ./webpack.config.js"
},
"dependencies": {
 "vue": "^2.3.4",
 "vue-router": "^2.5.3"
}

...

3. webpack配置文件

其次我们需要创建我们的webpack配置文件,这里和构建其他项目不同的是,vue单文件组件需要使用vue-loader加载器进行加载,同时使用babel-loader进行ES6语法的转换(完整 webpack 配置文件见最后实例源码):

module.exports = {
...

module: {
 rules: [
  {
   test: /\.vue$/,
   loader: 'vue-loader',
  },
  {
   test: /\.js$/,
   loader: 'babel-loader',
   exclude: /node_modules/
  },
 ]
},

...
}

4. 入口文件

这里我们需要编写在webpack中配置的入口文件地址的entry.js,主要功能为挂载生成的vue实例app至id为app的DOM节点上:

// entry.js
import { app } from './app.js'

app.$mount('#app')
// app.js
import Vue from 'vue'
import App from './App.vue'
import router from './router'

const app = new Vue({
 router,
 ...App
})

export { app, router }

5. vue组件编写

然后我们需要编写一个最简单的vue组件index.vue,将其放在views文件夹下

<template>
 <div>hello world!</div>
</template>

<script></script>

<style></style>

同时我们需要编写最外层父组件App.vue,一般像下面这样,主要嵌套一层router-view来动态展示不同路由下的内容:

<template>
 <router-view></router-view>
</template>

<script></script>

<style></style>

6. 路由配置

在编写完我们vue的单文件组件后,我们需要配置我们的路由文件,以便实现一个单页应用:

import Vue from 'vue' // 引入vue
import Router from 'vue-router' // 引入路由

Vue.use(Router) // 注册路由

import Index from '../views/index.vue' // 引入我们刚刚编写的简单的组件

export default new Router({
 mode: 'hash',
 routes: [
  { 
   path: '/', 
   name: 'index', 
   component: Index,
  },
  { path: '*', redirect: '/' },
 ]
})

7. 热加载

最后我们需要实现一个前端热加载的功能来实时更新我们修改后的页面,这里我们需要安装一个webpack-dev-server的插件,其可以为我们搭建一个本地小型的Node.js Express服务器。

详解vue项目构建与实战

安装完成后,我们需要在package.json的scripts中配置启动命令dev:

...

"scripts": {
 "dev": "webpack-dev-server",
 "build": "rimraf dist && cross-env NODE_ENV=prod&&webpack -p --config ./webpack.config.js"
}

...

上次配置的build命令用于删除dist目录并切换开发环境及打包压缩代码,而dev命令用于启动本地服务器,生成的包只会存在于内存中。

8. 注意事项

完成上方步骤后其实还会存在一个问题,那就是我们的部分ES6代码无法获得解析,这里我们还需要添加babel的配置文件.babelrc:

{
 "presets": [
 ["env", { "modules": false }],
 "stage-2"
 ],
 "plugins": ["transform-runtime"],
 "comments": false,
 "env": {
 "test": {
  "presets": ["env", "stage-2"],
  "plugins": [ "istanbul" ]
 }
 }
}

这里我们使用了stage-2来处理ES6中对象无法使用…解构的问题,同时使用transform-runtime来优化我们的代码利用率。

项目实例

上方只讲述了vue自定义构建的主要步骤和关键代码,详细代码实例可以参考:https://github.com/luozhihao/vue-setup-course

结语

本文主要介绍了vue项目构建的两种方式,vue-cli构建与自定义构建都有其适用的范围和对象,大家需要针对项目和自身条件的情况进行择优选择,同时在自定义构建中也有很多功能配置本文并未提及,感兴趣的童鞋可以自己继续探索。

Javascript 相关文章推荐
JS 的应用开发初探(mootools)
Dec 19 Javascript
JS控制显示隐藏兼容问题(IE6、IE7、IE8)
Apr 01 Javascript
jquery 实现二级/三级/多级联动菜单的思路及代码
Apr 08 Javascript
jquery仿搜索自动联想功能代码
May 23 Javascript
jQuery消息提示框插件Tipso
May 04 Javascript
JS制作图形验证码实现代码
Oct 19 Javascript
ES6中Symbol类型用法实例详解
Apr 06 Javascript
node.js中实现kindEditor图片上传功能的方法教程
Apr 26 Javascript
Vue.js基础指令实例讲解(各种数据绑定、表单渲染大总结)
Jul 03 Javascript
详解JavaScript按概率随机生成事件
Aug 02 Javascript
vue 修改 data 数据问题并实时显示的方法
Aug 27 Javascript
Vue 通过公共字段,拼接两个对象数组的实例
Nov 07 Javascript
微信小程序 蓝牙的实现实例代码
Jun 27 #Javascript
微信小程序 开发MAP(地图)实例详解
Jun 27 #Javascript
微信小程序商品到详情的实现
Jun 27 #Javascript
微信小程序的分类页面制作
Jun 27 #Javascript
JS实现批量上传文件并显示进度功能
Jun 27 #Javascript
angular过滤器实现排序功能
Jun 27 #Javascript
详解AngularJS ng-class样式切换
Jun 27 #Javascript
You might like
全国FM电台频率大全 - 6 辽宁省
2020/03/11 无线电
德生S2000南麂列岛台湾FM收听记录
2021/03/02 无线电
PHP的范围解析操作符(::)的含义分析说明
2011/07/03 PHP
PHP number_format() 函数定义和用法
2012/06/01 PHP
Zend Framework教程之连接数据库并执行增删查的方法(附demo源码下载)
2016/03/21 PHP
php使用include 和require引入文件的区别
2017/02/16 PHP
让网页根据不同IE版本显示不同的内容
2009/02/08 Javascript
JS 面向对象的5钟写法
2009/07/31 Javascript
jquery 表格的增行删行实现思路
2013/03/21 Javascript
javascript 面向对象封装与继承
2014/11/27 Javascript
JS实现超简洁网页title标题跑动闪烁提示效果代码
2015/10/23 Javascript
AngularJS 工作原理详解
2016/08/18 Javascript
浅谈js函数的多种定义方法与区别
2016/11/29 Javascript
大白话讲解JavaScript的Promise
2017/04/06 Javascript
JS 仿支付宝input文本输入框放大组件的实例
2017/11/14 Javascript
vue2.0 下拉框默认标题设置方法
2018/08/22 Javascript
在Web关闭页面时发送Ajax请求的实现方法
2019/03/07 Javascript
javascript操作向表格中动态加载数据
2020/08/27 Javascript
原生JS实现弹幕效果的简单操作指南
2020/11/10 Javascript
ajax jquery实现页面某一个div的刷新效果
2021/03/04 jQuery
[02:34]肉山说——泡妞篇
2014/09/16 DOTA
[01:06:25]Secret vs Liquid 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
Python获取服务器信息的最简单实现方法
2015/03/05 Python
Python实现PS滤镜Fish lens图像扭曲效果示例
2018/01/29 Python
Django实战之用户认证(初始配置)
2018/07/16 Python
Python日期时间模块datetime详解与Python 日期时间的比较,计算实例代码
2018/09/14 Python
Python基于pip实现离线打包过程详解
2020/05/15 Python
Python如何实现感知器的逻辑电路
2020/12/25 Python
CSS3实现千变万化的文字阴影text-shadow效果设计
2016/04/26 HTML / CSS
html5 制作地图当前定位箭头的方法示例
2020/01/10 HTML / CSS
Agoda香港:全球特价酒店预订
2017/05/07 全球购物
竟聘演讲稿范文
2013/12/31 职场文书
2015年小学总务工作总结
2015/07/21 职场文书
《窃读记》教学反思
2016/02/18 职场文书
2019同学聚会主持词
2019/05/06 职场文书
基于Python实现射击小游戏的制作
2022/04/06 Python