vue项目搭建及基本配置

Posted 流眸

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue项目搭建及基本配置相关的知识,希望对你有一定的参考价值。

前言

注:适用于windows系统本文讲述要点:

  1. vue-cli项目搭建基本环境配置;

  2. 常用插件描述及分享;

  3. 项目运行、调试及打包;

  4. 项目配置及优化;

适用人群:

  1. vue小白;

  2. html\css\js编程基础;

  3. vue项目整体优化(打包后压缩空间);


一、准备阶段

准备阶段会将项目环境配置完毕,包含 nodenpmwebpackvue-cli。已经完成的小伙伴可以跳过此步骤看第二阶段。

1.安装 node及 npm

  从node.js中文网下载并安装nodejs点击下载 .msi的32/64位安装包,然后双击本地文件一路点击 下一步完成 nodeJs的安装即可。注意安装8.10以上版本哟!安装完成后,打开命令行工具,输入 node-v,如下:

 
   
   
 
  1. E:\>node -v

  2. v8.12.0 //版本号

顺便在此处继续输入 npm-v

 
   
   
 
  1. E:\>npm -v

  2. 6.4.1 //版本号

你会惊讶的发现 npm已经神奇的安装完成了。这是因为 npm在安装 nodeJs的时候顺带已经装好了。

2.安装 webpack

注:以下所有 npm操作,由于国内速度较慢甚至出现失败,可用淘宝镜像 cnpm替代。下列所有 npm命令,用 cnpm替代即可。方式如下:

 
   
   
 
  1. npm install -g cnpm --registry=https://registry.npm.taobao.org

  继续刚才的命令行工具,输入 npm install webpack-g-g代表全局安装。安装完成后继续输入 webpack-v,出现相应版本号,代表安装成功。我在安装时出现如下状况:

 
   
   
 
  1. One CLI for webpack must be installed. These are recommended choices, delivered as separate packages:

  2. - webpack-cli (https://github.com/webpack/webpack-cli)

  3. The original webpack full-featured CLI.

  4. We will use "npm" to install the CLI via "npm install -D".

  5. Do you want to install 'webpack-cli' (yes/no):

解决方案是:输入 npm install webpack-cli-g。安装成功后执行 webpack-v查看版本号,如下:

 
   
   
 
  1. E:\>npm install webpack-cli -g

  2. *

  3. *

  4. *

  5. *

  6. *

  7. *


  8. E:\>webpack -v

  9. 4.29.6 //版本号

3.安装vue脚手架 vue-cli

  继续上面的命令行工具。接下来就是安装配置今天的主角了,vue脚手架工具 vue-cli。方法一样,键入命令行 npm install vue-cli-g全局安装,然后输入 vue-V注:是大写的 -V检测是否安装成功。如下:

 
   
   
 
  1. E:\>vue -V

  2. 2.9.6 //版本号

4.小结

  至此,我们已经完成了准备阶段的工作。主要完成的是 nodenpmwebpackvue-cli四个工具的环境配置。目前为止,我们在命令行工具的总结应该是如下:版本号不必一致

 
   
   
 
  1. E:\>node -v

  2. v8.12.0


  3. E:\>npm -v

  4. 6.4.1


  5. E:\>webpack -v

  6. 4.29.6


  7. E:\>vue -V

  8. 2.9.6


二、项目搭建

本阶段讲述 vue-cli项目搭建及相关配置,包含 创建项目修改基础配置项目运行三个模块,可自行选择阅读或跳过。

1.项目创建

  建立一个空文件夹,最好以纯英文命名。例,我项目路径为 E>stydy。打开命令行工具, cd到该文件目录下,执行 vue init webpack namename可替换为你要创建的项目名。回车之后,会要求输入一系列的信息,大部分可直接回车略过,注释如下,没有注释的回车略过即可:

 
   
   
 
  1. E:\stydy>vue init webpack blog


  2. ? Project name blog //项目名

  3. ? Project description A Vue.js project //项目简介

  4. ? Author xuan0146 <zxm0146@163.com> //作者

  5. ? Vue build runtime

  6. ? Install vue-router? Yes //使用项目路由

  7. ? Use ESLint to lint your code? No //不开启ESLint语法检测 注意选No

  8. ? Set up unit tests Yes

  9. ? Pick a test runner jest

  10. ? Setup e2e tests with Nightwatch? Yes

  11. ? Should we run `npm install` for you after the project has been created? (recommended) npm


  12. vue-cli · Generated "blog".

最后一步选择 npm或者 yarn则会自动执行 npm install安装项目所有依赖包。不选择的话,自己安装也是同样效果。安装步骤为:

  1. cd到项目路径;

  2. 执行 npm install

  3. 等待完成安装即可;

2.项目介绍

   cd到该项目,或者打开文件夹,项目目录及备注如下:

 
   
   
 
  1. ├── project //项目目录

  2. ├── build //webpack相关配置

  3. ├── build.js //生产环境构建

  4. ├── check-versions.js //版本检查

  5. ├── utils.js //构建相关工具

  6. ├── vue-loader.conf.js //处理vue文件的配置信息

  7. ├── webpack.base.conf.js //webpack基础配置

  8. ├── webpack.dev.conf.js //webpack开发环境配置

  9. ├── webpack.prod.conf.js //webpack生产环境配置

  10. ├── config //vue基本配置

  11. ├── dev.env.js //开发环境配置

  12. ├── index.js //主要配置

  13. ├── prod.env.js //生产环境配置

  14. ├── test.env.js //测试环境配置

  15. ├── node_modules //依赖包 忽略

  16. ├── src //项目核心文件

  17. ├── assets //静态资源 如公用js\css\image\媒体资源等

  18. ├── components //公用组件

  19. ├── router //项目路由

  20. ├── index.js //路由控制文件

  21. ├── App.vue //根组件

  22. ├── main.js //入口文件

  23. ├── static //静态资源

  24. ├── test //模拟测试

  25. ├── .babelrc //babel参数

  26. ├── .editorconfig //代码格式

  27. ├── .gitignore //git上传相关配置

  28. ├── .postcssrc.js //css相关工具

  29. ├── index.html //主页

  30. ├── package-lock.json //记录当前状态下实际安装的各个npm package的具体来源和版本号

  31. ├── package.json //项目信息

  32. ├── README.md //项目说明

3.启动项目

  命令行工具键入 npm run dev,等待片刻,直到提示如下,则表示启动成功:

 
   
   
 
  1. E:\stydy\blog>npm run dev


  2. * * * * * * * *

  3. * 启动过程忽略 *

  4. * * * * * * * *


  5. Your application is running here: http://localhost:8080

4.移动端调试

  有的人可能要问了,如果我做移动端项目,不能用localhost去访问了吧?当然不能,只需要稍微改一下配置即可。当然,端口号8080一样可以修改,不过一般不做变动。  用代码工具(自己习惯的IDE)打开本项目。首先查看本机电脑ip,键入命令 ipconfig,查看如下:

 
   
   
 
  1. E:\stydy\blog>ipconfig

  2. * *

  3. * *

  4. 以太网适配器 以太网:


  5. 连接特定的 DNS 后缀 . . . . . . . :

  6. 子网掩码 . . . . . . . . . . . . : 255.255.255.0

  7. 默认网关. . . . . . . . . . . . . : fe80::48:5112:9520:564f%10

  8. 192.168.200.1

 
   
   
 
  1. module.exports = {

  2. dev: {

  3. host: '192.168.200.127', //localhost改为ip

  4. port: 8080, //端口号

  5. }

  6. }

  然后,我们重新启动项目。注意上次项目启动后,由于修改了配置文件,因此需要停止项目然后重新启动。停止项目的命令为 Ctrl+C。重启项目后,如下:

 
   
   
 
  1. E:\stydy\blog>npm run dev

  2. * * * * * * * *

  3. * *

  4. * * * * * * * *

  5. Your application is running here: http://192.168.200.127:8080


三、常用插件

本章节记录一些vue常用插件,如 axiosechartssass/scsslib-flexible等等。所有命令均可用 cnpm替代。如不需要可直接跳过。

1.sacc/scss

用途:可用 sass/scss进行css书写代码。命令行工具依次键入如下命令:

 
   
   
 
  1. npm install node-sass --save-dev

  2. npm install sass-loader --save-dev

安装完成后, .vue里的 style里添加 lang="scss"来指定语言,即可用 sass/scss编写css代码。如下:

 
   
   
 
  1. <style lang="scss" scoped>

  2. ...

  3. </style>

2.axios

用途:平时前后端交互使用 Ajax,在vue官方,给出 vue-resourceaxios的作为 ajax的替代。在此处使用vue官方推荐首选的 axios作为案例讲述。

  • 安装

 
   
   
 
  1. npm install axios

  • 全局引入 在 项目/src/main.js中引入如下代码,然后随意走个请求,发现……报错?并且在页面F12控制台 Newwork>Headers里面发现数据并没有Form Data形式提交,如何处理呢?见下一步解决。

 
   
   
 
  1. import axios from 'axios'

  • 解决数据格式问题

 
   
   
 
  1. //完整请求代码 post为例

  2. this.$axios.post('url', { //路径

  3. key1: 'value', //参数

  4. key2: 'value' //参数

  5. },


  6. /* *

  7. * 添加如下代码

  8. * * * * * * start * * * * *

  9. {

  10.   transformRequest: [function (data) {

  11. let ret = '';

  12. for (let it in data) {

  13. ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&';

  14. }

  15. return ret

  16. }

  17. ],

  18.   headers: {

  19.     'Content-Type': 'application/x-www-form-urlencoded'

  20. }

  21. }

  22. /* * * * * * end * * * * *


  23. ).then((response) => { //返回数据

  24. console.log(response)

  25. }).catch((error) => { //请求异常捕捉

  26. console.log(error)

  27. })

3.axios解决方案

  另外一个axios数据格式问题的解决方案。重磅推荐★★★★★此方案不仅解决数据格式问题,还顺便解决了跨域问题。第一步当然还是安装 axios,同上一步。然后,安装 qs,命令行工具键入 npm install qs--save-dev。然后在 项目/src/main.js中配置如下:

 
   
   
 
  1. import axios from 'axios'

  2. import qs from 'qs'


  3. Vue.prototype.$axios = axios;

  4. Vue.prototype.$qs = qs;

然后在 项目/config/index.js中,找到 proxyTable,配置及说明如下:

 
   
   
 
  1. proxyTable: {

  2. '/api': {

  3. //设置url公用部分

  4. target: 'http://192.168.1.100:8080/',

  5. changeOrigin: true, // 如果接口跨域,需要进行这个参数配置

  6. pathRewrite: {

  7. }

  8. }

  9. },

配置完成之后,在 .vue文件中,请求用例如下:

 
   
   
 
  1. //参数

  2. let params = this.$qs.stringify({

  3. key: value

  4. });

  5. //请求

  6. this.$axios.post('/api/test', params).then((response) => {

  7. console.log(response);

  8. }).catch((error) => {

  9. console.log(error);

  10. })

最后,键入命令 npm run dev,发现请求数据格式已经成为 FormData的格式,并且即使后端不处理跨域问题,也依然正常可用。原因是 proxy作为中间层,先将数据请求回本地,此过程是中间层node请求后台,不存在跨域。然后请求过来的数据放在本地,前端再去请求这个数据,就可以解决跨域问题了。

4.echarts可视化

  如今相信大家不少项目需要用到数据可视化吧?各种统计图表、炫酷可视化效果等等,都需要一个不错的插件去支撑,比如 D3AnyChartechartsHighCharts等等。本案例用百度的 echarts作为案例讲解。

  • 安装依赖 惯例,先装依赖。命令行工具执行 npm install echarts--save-dev

  • 全局配置 安装完成后,全局引入。引入方法:进入 项目/src/main.js,如下操作:

 
   
   
 
  1. import echarts from 'echarts'


  2. Vue.prototype.$echarts = echarts

  • 使用 在 ***.vue组件中即可正常使用。我在此处用 Hello.vue写示例:

 
   
   
 
  1. //template

  2. <div id="demo"></div>


  3. //script

  4. let myChart = this.$echarts.init(document.getElementById('demo')); //初始化

  5. //myChart.clear(); //根据需求配置

  6. myChart.setOption({ // 图表配置

  7. xAxis: {

  8. type: 'category',

  9. data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']

  10. },

  11. yAxis: {

  12. type: 'value'

  13. },

  14. series: [{

  15. data: [820, 932, 901, 934, 1290, 1330, 1320],

  16. type: 'line',

  17. smooth: true

  18. }]

  19. });


  20. //style

  21. #demo{

  22. width: 500px;

  23. height: 500px;

  24. }

  • 按需引入 试过之后会发现echarts的包很大,会导致打包之后文件过大,因此如果不是刚需的情况下,建议按需引入来完成页面,会节省许多资源及开销。首先,将刚才 项目/src/main.js中的两行代码注释掉。接下来,依然以 Hello.vue举例,如下:

 
   
   
 
  1. //template && style 不作变动


  2. //script

  3. const echarts = require('echarts/lib/echarts'); //基本模板

  4. require('echarts/lib/chart/line'); //折线图组件

  5. require('echarts/lib/component/title'); //标题组件


  6. // 初始化实例

  7. let myChart = echarts.init(document.getElementById('demo'));

  8. // 图表配置

  9. myChart.setOption({

  10. title: { text: '引入title组件可使用标题' },

  11. * * * * * * * *

  12. * 别的配置不变 *

  13. * * * * * * * *

  14. });

5.lib-flexible | px2rem-loader

  lib-flexible作用在于写页面的时候实现自适应效果,包括文图排本等。需要配合 px2rem-loader使用。步骤如下:

  • 安装依赖

 
   
   
 
  1. npm i lib-flexible --save-dev


  2. npm install px2rem-loader --save-dev

  • 引入 项目/src/main.js中做如下配置:

 
   
   
 
  1. import 'lib-flexible

  • 主页添加视口配置 项目/index.html中的 head中添加:

 
   
   
 
  1. <meta name="viewport" content="width=device-width, initial-scale=1.0">

  • px2rem配置 项目/build/utils.js中如下配置,然后重启项目即可:

 
   
   
 
  1. //自适应字体配置

  2. const px2remLoader = {

  3. loader: 'px2rem-loader',

  4. options: {

  5. remUnit: 37.5 //设计稿的宽度除以 10,现阶段一般设计稿的宽度都为750px。如果基于iPhone5设计则为32.0(320 / 10 = 32)

  6. }

  7. }


  8. function generateLoaders (loader, loaderOptions) {

  9. const loaders = options.usePostCSS ? [cssLoader, postcssLoader, px2remLoader] : [cssLoader, px2remLoader]


  10. * * *

  11. }

  • 更多关于px2rem的介绍请移步官网


四、项目打包

本章节介绍 打包以及去除打包后资源中的 .map文件。开发完成后,怎么打包到线上呢?emm...this is a problem.

1.打包

命令行工具 cd到该项目下,执行 npm run build来构建项目:

 
   
   
 
  1. E:\stydy\blog>npm run build


  2. Asset Size Chunks Chunk Names

  3. static/js/vendor.38756a8637fc194013f9.js 442 kB 0 [emitted] [big] vendor

  4. static/js/app.0b5326236ed4caddb252.js 1.1 kB 1 [emitted] app

  5. static/js/manifest.2ae2e69a05c33dfc65f8.js 857 bytes 2 [emitted] manifest

  6. static/css/app.26e0081e2c66d97635076ad7fefbb5b6.css 164 bytes 1 [emitted] app

  7. static/css/app.26e0081e2c66d97635076ad7fefbb5b6.css.map 348 bytes [emitted]

  8. static/js/vendor.38756a8637fc194013f9.js.map 2.38 MB 0 [emitted] vendor

  9. static/js/app.0b5326236ed4caddb252.js.map 8.47 kB 1 [emitted] app

  10. static/js/manifest.2ae2e69a05c33dfc65f8.js.map 4.97 kB 2 [emitted] manifest

  11. index.html 571 bytes [emitted]


  12. Build complete.

2.位置

打包完成后,去哪儿了呢?然后会发现在项目路径下,出现了一个 dist的文件夹,这里面就是所谓的* 包 *了。如下:

 
   
   
 
  1. ├── project

  2. ├── build

  3. ├── config

  4. ├── dist // 包

  5. ├── static // 压缩后的资源

  6. ├── index.html // 主页

  7. ├── node_modules

  8. ├── src

  9. ├── static

  10. ├── test

  11. ├── .babelrc

  12. ├── .editorconfig

  13. ├── .gitignore

  14. ├── .postcssrc.js

  15. ├── index.html

  16. ├── package-lock.json

  17. ├── package.json

  18. ├── README.md

3.问题&解决

细心的你可能发现了, dist/static/css(或js)里面,每个css文件和js文件下有一个同名的 .map文件,非常占空间,那它是做什么的呢?又怎么消除呢?

  • 作用
    查过资料的小伙伴知道了, .map文件的作用就是:项目打包后,代码都是经过压缩加密的,如果运行时报错,输出的错误信息无法准确得知是哪里的代码报错。有了map就可以像未加密的代码一样,准确的输出是哪一行哪一列有错。

  • 如何解决 那么该如何处理这些文件呢?进入 项目/config/index.js,定位到 productionSourceMap,将其值改为 false即可。如下:

 
   
   
 
  1. productionSourceMap: false,

  • 重新打包验证 在命令行工具重新执行 npm run build,发现 .map文件已经消失,问题解决。如下:

 
   
   
 
  1. E:\stydy\blog>npm run build


  2. Asset Size Chunks Chunk Names

  3. static/js/vendor.38756a8637fc194013f9.js 442 kB 0 [emitted] [big] vendor

  4. static/js/app.3c96ecd23cc6dc073a3e.js 1.05 kB 1 [emitted] app

  5. static/js/manifest.2ae2e69a05c33dfc65f8.js 799 bytes 2 [emitted] manifest

  6. static/css/app.26e0081e2c66d97635076ad7fefbb5b6.css 95 bytes 1 [emitted] app

  7. index.html 571 bytes [emitted]


  8. Build complete.


五、包优化

  在项目逐渐壮大之后,虽然说上面已经讲述过了如何去除 .map文件,但是其中许多 .js文件的体积也不容小觑。尤其是发布到线上以后,某些css/js单个文件体积极可能超上兆的大小,如果项目服务器带宽不够,但是页面迸发量不低的话,分分钟就可能挂掉。有没有什么方法能进一步将包优化呢?

1.gzip打包压缩
  • 安装gzip 惯例,打开命令行工具,安装 gzip

 
   
   
 
  1. npm install compression-webpack-plugin@1.1.11 --save-dev

  • 配置 项目/config/index.js中,定位到 productionGzip,改为 true

 
   
   
 
  1. productionGzip: true,

  • 重新打包 npm run build走起,会发现打包的文件中多了同名的 .gz文件,体积大概压缩了2/3,很棒的体验。如下:

 
   
   
 
  1. E:\stydy\blog>npm run build


  2. Asset Size Chunks Chunk Names

  3. static/js/vendor.38756a8637fc194013f9.js 442 kB 0 [emitted] [big] vendor

  4. static/js/app.3c96ecd23cc6dc073a3e.js 1.05 kB 1 [emitted] app

  5. static/js/manifest.2ae2e69a05c33dfc65f8.js 799 bytes 2 [emitted] manifest

  6. static/css/app.26e0081e2c66d97635076ad7fefbb5b6.css 95 bytes 1 [emitted] app

  7. index.html 571 bytes [emitted]

  8. static/js/vendor.38756a8637fc194013f9.js.gz 155 kB [emitted]


  9. Build complete.

  • nginx配置 虽然很给力的节省了许多资源,但是需要运维配合,在 gninx.conf配置文件中做如下配置:

 
   
   
 
  1. http {

  2. gzip on;

  3. gzip_disable "msie6";

  4. gzip_vary on;

  5. gzip_proxied any;

  6. gzip_comp_level 8; //压缩级别

  7. gzip_buffers 16 8k;

  8. #gzip_http_version 1.1;

  9. gzip_min_length 100; //不压缩临界值

  10. gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;

  11. }

2.采用cdn加速

  顾名思义,即将一些比较大的插件放在第三方服务器上去加载,这样不仅快很多,也能更加节约自己的服务器资源及宽带资源。我们一般选用 unpkg或者 BootCDN来作为第三方。在此处我们使用 BootCDN来作为第三方加速使用。想了解更多相关知识请点击unpkg BootCDN。

  • 查找包 打开BootCDN,在搜索栏搜索想要的第三方资源。如,我想要替换的是 echarts、 Vue、 axios,则依次搜索 echarts...,然后查找我想要的版本,然后 复制<script>标签

  • 插入 在 项目/index.html中将标签插入,如下:

 
   
   
 
  1. <body>

  2. <div id="app"></div>

  3. //插入在这里

  4. <script src="https://cdn.bootcss.com/vue/2.5.20/vue.min.js"></script>

  5. <script src="https://cdn.bootcss.com/vue-router/3.0.1/vue-router.min.js"></script>

  6. <script src="https://cdn.bootcss.com/echarts/4.2.1-rc1/echarts-en.common.js"></script>

  7. <script src="https://cdn.bootcss.com/axios/0.19.0-beta.1/axios.js"></script>

  8. </body>

  • webpack配置 打开 项目/build/webpack.base.conf.js中,添加 externals:

 
   
   
 
  1. module.exports = {

  2. context: path.resolve(__dirname, '../'),

  3. //..

  4. externals:{

  5. 'vue': 'Vue',

  6. 'vue-router': 'VueRouter',

  7. 'echarts':'echarts',

  8. 'axios':'axios',

  9. }


  10. }

  • main配置 打开 项目/src/main.js,将 Vue等注释掉即可。不注释也可。

 
   
   
 
  1. // import Vue from 'vue'

  • 打包 最后,见证奇迹的时刻就要到了~

 
   
   
 
  1. E:\stydy\blog>npm run build


  2. Asset Size Chunks Chunk Names

  3. static/js/vendor.1f9d0533037be66c61cf.js 12.3 kB 0 [emitted] vendor

  4. static/js/app.912fd568ff845fde7c09.js 1.36 kB 1 [emitted] app

  5. static/js/manifest.2ae2e69a05c33dfc65f8.js 799 bytes 2 [emitted] manifest

  6. static/css/app.edc64bd802cdc531977a30fcc8a9d6e1.css 62 bytes 1 [emitted] app

  7. index.html 876 bytes [emitted]

  8. static/js/vendor.1f9d0533037be66c61cf.js.gz 4.62 kB [emitted]


  9. Build complete.

  • 搞定 上次打包, vendor大小为442kB,本次打包,疯狂缩小至12.3kB。神不神奇~厉不厉害~


结语

  到这里,vue项目从环境配置、项目搭建,到结构介绍、常用插件依赖安装使用做了比较详细的介绍,最后将项目优化也做了一定的补充。  学而时习之,温故而知新。至此,以上。


以上是关于vue项目搭建及基本配置的主要内容,如果未能解决你的问题,请参考以下文章

最详细安装Vue脚手架及快速图形可视化搭建Vue项目

vue-cli4.5 搭建( vue3+ TypeScript + ant design2)环境 及 VSCode 代码自动格式化配置

@vue/cli 3 安装搭建及 webpack 配置

原创从零开始搭建Electron+Vue+Webpack项目框架,一套代码,同时构建客户端web端

SpringBoot+Vue前后端分离项目的搭建及简单开发(这次保证看明白~)

Python vue坏境搭建及项目创建