vue移动端项目搭建

本项目搭建适用于h5移动端的vue项目搭建,主体是基于vue-cli3脚手架,目的在于搭建个可用于快速启动项目的基础框架。话不多说,马上动手搭建:

1.安装vue cli3

注意Vue CLI 3需要 nodeJs ≥ 8.9 (官方推荐 8.11.0+)

npm install -g @vue/cli

2.新建项目

vue create projectname

选择配置:

首先是选择预设:



第一个是上次本人新建保存的预设,首次预设只有下面两个选项,第一个是默认,第二个是手动配置,我们选择最后一个manually select features


下一步选择手动配置项,图为本人选择的

Check the features needed for your project: (Press to select, to toggle all, to invert selection)
( ) Babel //转码器,可以将ES6代码转为ES5代码,从而在现有环境执行。
( ) TypeScript// TypeScript是一个JavaScript(后缀.js)的超集(后缀.ts)包含并扩展了 JavaScript 的语法,需要被编译输出为 JavaScript在浏览器运行,目前较少人再用
( ) Progressive Web App (PWA) Support// 渐进式Web应用程序
( ) Router // vue-router(vue路由)
( ) Vuex // vuex(vue的状态管理模式)
( ) CSS Pre-processors // CSS 预处理器(如:less、sass)
( ) Linter / Formatter // 代码风格检查和格式化(如:ESlint)
( ) Unit Testing // 单元测试(unit tests)
( ) E2E Testing // e2e(end to end) 测试

是否使用history router:y


选择使用的css预处理器

SCSS/SASS //Sass安装需要Ruby环境,是在服务端处理的,SCSS 是 Sass3新语法(完全兼容 CSS3且继承Sass功能)
LESS //Less最终会通过编译处理输出css到浏览器,Less 既可以在客户端上运行,也可在服务端运行 (借助 Node.js)
Stylus //Stylus主要用来给Node项目进行CSS预处理支持,Stylus功能上更为强壮,和js联系更加紧密,可创建健壮的、动态的的CSS。

eslint校验方式



保存时就检测



如何存放配置

选择独立文件存放,不建议放package,后续配置麻烦也容易有坑,一些配置放这里不起作用。
配置完就会开始安装了。

项目基本框架

项目默认没有vue.config.js文件,需要自己创建在项目根目录下

npm run serve启动项目,为了方便,我自己添加了npm run dev的启动方式
package.json添加


3.配置移动端自适应----- flexible和 postcss-px2rem(或者postcss-px2rem-exclude)

1.flexible
lib-flexible会自动在html的head中添加一个meta name="viewport"的标签,同时会自动设置html的font-size为屏幕宽度除以10,也就是1rem等于html根节点的font-size。假如设计稿的宽度是750px,此时1rem应该等于75px。

注意:
1.检查一下html文件的head中,如果有 meta name="viewport"标签,需要将他注释掉,因为如果有这个标签的话,lib-flexible就会默认使用这个标签。而我们要使用lib-flexible自己生成的 meta name="viewport"来达到高清适配的效果。
2.因为html的font-size是根据屏幕宽度除以10计算出来的,所以我们需要设置页面的最大宽度是10rem(750px 一般设计稿都是给750px的)。

npm install lib-flexible --save

在main.js加入import 'lib-flexible'

在App.vue注释或删掉原始nav相关,替换app原来的样式

#app {
  width: 100%;
  min-height: 100%;
  min-width: 320px;
  max-width: 750px;
  margin: 0 auto;
  color: #333;
}

2.postcss-px2rem(或者postcss-px2rem-exclude)
在无第三方UI库使用时,可以使用postcss-px2rem

npm  install postcss-px2rem --save

在vue.config.js添加

module.exports = {
    css: {
        loaderOptions: {
          postcss: {
            // 这是rem适配的配置  注意: remUnit在这里要根据lib-flexible的规则来配制,如果您的设计稿是750px的,用75就刚刚好。
             plugins: [
              require("postcss-px2rem")({
                remUnit: 75
          })
        ]
      }
    }
}

使用第三方UI时上面的方法会让第三方ui库样式变小,改用postcss-px2rem-exclude

npm  install postcss-px2rem-exclude --save

在项目根目录下的postcss.config.js文件,如果你的项目没有生成这个独立文件,就需要在你的package.js里设置或者创建一个postcss.config.js文件。
floder_name为第三方UI库名称

最好用第一个方法

**postcss.config.js**

module.exports = {
  plugins: {
    autoprefixer: {}, 
    "postcss-px2rem-exclude": {
      remUnit: 75,
      exclude: /node_modules|folder_name/i
    }
  }
};
**package.json
"postcss": {
    "plugins": {
      "autoprefixer": {},
      "postcss-px2rem-exclude":{
          "remUnit": 75,
          "exclude":"/node_modules|floder_name/i"
      }
    }
  }

4.axios

npm  install axios --save

在src文件夹下新建utils文件,在此文件下新建apiPath.js和request.js,api用来存放各接口,request编写统一的请求处理。
例如:


apiPath.js

request.js:

import axios from 'axios'

// 创建axios实例
const service = axios.create({
    baseURL: '',
    timeout: 60 * 1000, // 请求超时时间
})

const errorHandler = (res) => {
    let msgStr = '';
    if (res.message && res.code) {
        msgStr = `${res.message}(${res.code})`;
    } else {
        msgStr = '抱歉,系统错误';
    }
    console.log(msgStr)
    // 提示错误信息或者处理特殊信息
   ......
}

// request拦截器
service.interceptors.request.use(
    config => {
        // 其他处理
        const token = getToken();
        if (token) {
            config.headers['Authorization'] = `${token}`;
        }
        return config
    },
    error => {
        // Do something with request error
        console.error(error) // for debug
        Promise.reject(error)
    }
)

// response 拦截器
service.interceptors.response.use(
    response => {
        const res = response.data
        try {
            if (res.code !== 0) {
                errorHandler(res);
                return Promise.reject(res)
            } else {
                return res.data
            }
        } catch(e) {
            console.error(e);
        }
    },
    (error) => {
        console.error(error.response); // for debug
        return Promise.reject(error.response) // 只写error捕获不了
    }
)

export default service

发送请求:

// 引入
import request from '@/utils/request';
import apiPath from '@/utils/apiPath';

// 发起
request({
       url: apiPath.API_URL,
       method: 'get',
       params: {
              id: ''
       },
}).then(data => {
    console.log(data)
}).catch(error => {
     console.log(error)
})

request({
       url: apiPath.API_URL,
       method: 'post',
       data: {
              id: ''
       },
}).then(data => {
    console.log(data)
}).catch(error => {
     console.log(error)
})

5. vconsole方便移动端debug

npm  install vconsole --save

app.vue加入

<script>
import VConsole from 'vconsole';
export default {
  mounted() {
    let isDebug = this.$route.query.isDebug;
    if (isDebug) {
      let vConsole = new VConsole();
    }
  },
}
</script>

路由加上isDebug=true即可

6.其他基础东西的堆砌


新建一些基础样式表,reset为一些标签的初始化,common为共用的样式。
main.js中引入即可
import './assets/css/reset.scss'
import './assets/css/common.scss'

至此,一个基本的vue移动框架搭建完毕,可以着手开发了。

问题反馈:
1.项目部署上线发现路由跳转遇到问题,莫名带上配置cdn的路由,各种跳转都很乱
解决:

const router = new VueRouter({
    mode: 'history',
    base: '/', // 这里配置一下
    // base: process.env.BASE_URL,
    routes
})

2.区分线上的测试环境和生产环境
package.json增加

"dev-build": "vue-cli-service build --mode development",  // 指定process.env.NODE_ENV为development

参考: https://segmentfault.com/a/1190000015133974

3.vue.config.js配置本地代理
在module.exports里加入

devServer: {
        host: "0.0.0.0", //要设置当前访问的ip 否则失效
        port: 8080,//当前web服务端口
        open: false, //浏览器自动打开页面
        proxy: {
          '/api': {
            target: 'https://',//目标地址
            ws: true,//是否代理websocket
            changeOrigin: true,//是否跨域
            pathRewrite: {
            //   '^/api': ''//url重写
            }
          }
        }
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342

推荐阅读更多精彩内容