Vue desarrollo móvil terminal h5 medio ambiente construcción

Selección de tecnología

La empresa ahora necesita desarrollar h5 en el lado móvil, usando el popular vue 2.0 para el desarrollo, el andamiaje usado es Vant2, el acceso a la red usa axios, el salto de enrutamiento usa vue-router y la herramienta de desarrollo es vscode, como un Android programa de desarrollo No estoy familiarizado con vue, pero afortunadamente, he configurado el entorno.Grabaré el tutorial más detallado sobre el uso de axios en vue en
Vant 2
vue cli
vue vue a través del blog vue router

Construcción del entorno

importar biblioteca

Instalé nodejs aquí y configuré el espejo Taobao

registro del conjunto de configuración de npm https://registry.npm.taobao.org

. Estas configuraciones están disponibles en línea, puede verificarlas usted mismo.
Vscode no puede crear directamente un proyecto en la herramienta, primero debe crear una carpeta vacía y luego abrir la carpeta a través de vscode.
Cree una carpeta VueForBlog en la carpeta E:\vueProject, use vscode para abrirla (vscode solo puede abrir un proyecto de forma predeterminada, si desea abrir más de uno, puede usar ctrl+shift+n), haga clic en el terminal de la barra de herramientas , cree una nueva terminal y comience oficialmente Crear
entrada de terminal de proyecto

npm i vant@latest-v2 -S

volver a entrar en

npm instalar -g @vue/cli

La instalación está completa
inserte la descripción de la imagen aquí
Abre package.json para ver las dependencias
inserte la descripción de la imagen aquí
Crea un proyecto

vue crear primero-vue

Esto no parece ser capaz de usar la joroba. Acabo de informar un error cuando comencé a usar firstVue. En general, aparecerán las opciones. He elegido vue2. inserte la descripción de la imagen aquí
Una vez completada la creación, se verá así
inserte la descripción de la imagen aquí
. Recuerde, debe ingresar al proyecto con un cd más adelante. De lo contrario, cree una referencia fuera del proyecto y
use el mismo método para introducir axios. y enrutador. , y postcss-px-to-viewport, postcss-pxtorem, lib-flexible que vant necesita usar

npm install [email protected]
npm install axios
npm i -S amfe-flexible
npm install postcss postcss-pxtorem --save-dev
npm install postcss-px-to-viewport --save-dev
npm install --save less -cargador menos

Entorno de configuración

Configure el estilo básico de la furgoneta para facilitar la referencia de los componentes de la furgoneta. Cree theme.less en first\src\assets\style\, content

// Color Palette
@black: #000;
@white: #fff;
@gray-1: #f7f8fa;
@gray-2: #f2f3f5;
@gray-3: #ebedf0;
@gray-4: #dcdee0;
@gray-5: #c8c9cc;
@gray-6: #969799;
@gray-7: #646566;
@gray-8: #323233;
@red: #ee0a24;
@blue: #1989fa;
@orange: #ff976a;
@orange-dark: #ed6a0c;
@orange-light: #fffbe8;
@green: #07c160;

// Gradient Colors
@gradient-red: linear-gradient(to right, #ff6034, #ee0a24);
@gradient-orange: linear-gradient(to right, #ffd01e, #ff8917);

// Component Colors
@text-color: @gray-8;
@active-color: @gray-2;
@active-opacity: 0.7;
@disabled-opacity: 0.5;
@background-color: @gray-1;
@background-color-light: #fafafa;
@text-link-color: #576b95;

// Padding
@padding-base: 4px;
@padding-xs: @padding-base * 2;
@padding-sm: @padding-base * 3;
@padding-md: @padding-base * 4;
@padding-lg: @padding-base * 6;
@padding-xl: @padding-base * 8;

// Font
@font-size-xs: 10px;
@font-size-sm: 12px;
@font-size-md: 14px;
@font-size-lg: 16px;
@font-weight-bold: 500;
@line-height-xs: 14px;
@line-height-sm: 18px;
@line-height-md: 20px;
@line-height-lg: 22px;
@base-font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue',
  Helvetica, Segoe UI, Arial, Roboto, 'PingFang SC', 'miui', 'Hiragino Sans GB',
  'Microsoft Yahei', sans-serif;
@price-integer-font-family: Avenir-Heavy, PingFang SC, Helvetica Neue, Arial,
  sans-serif;

// Animation
@animation-duration-base: 0.3s;
@animation-duration-fast: 0.2s;
@animation-timing-function-enter: ease-out;
@animation-timing-function-leave: ease-in;

// Border
@border-color: @gray-3;
@border-width-base: 1px;
@border-radius-sm: 2px;
@border-radius-md: 4px;
@border-radius-lg: 8px;
@border-radius-max: 999px;

En el mismo directorio, crea un public.css con el contenido


body {
    
    
  background-color: #f8f8f9;
  min-height: 100vh;
  min-width: 100vw;
}
.padding-lr10 {
    
    
  padding: 0 10px;
}
.phoneContant header .van-nav-bar {
    
    
  text-align: center;
  line-height: 56px;
  background: #68c2bd;
}
h3 {
    
    
  font-size: 16px;
}
.phoneContant header .van-nav-bar .van-icon {
    
    
  font-size: 20px;
  color: #fff;
}
.phoneContant header .van-nav-bar__title {
    
    
  color: #fff;
}
.contant {
    
    
  padding: 0 10px;
}
.re {
    
    
  position: relative;
}
.cardContant {
    
    
  background: #f5f5f5;
  height: 78vh;
  width: 100%;
  clear: both;
  padding: 8px 0;
}
.hosImg {
    
    
  width: 60px !important;
  height: 60px !important;
  border-radius: 50%;
}


El contenido aquí se personaliza según los estilos requeridos en el proyecto y se configura
en vue.config.js

css: {
    
    
    loaderOptions: {
    
    
      less: {
    
    
        lessOptions: {
    
    
          modifyVars: {
    
    
            // 或者可以通过 less 文件覆盖(文件路径为绝对路径)
            hack: `true; @import "@/assets/style/theme.less";`,
          },
        },
      },
    },
  },

Hay una forma rápida de acceder a la ruta del recurso. Establezca un símbolo para especificar directamente el directorio src, que es más conveniente que usar .o ..no es fácil cometer errores. También en vue.config.js, @representa el directorio src

  chainWebpack: (config) => {
    
    
    config.resolve.alias.set("@", resolve("src"));
    config.plugin("html").tap((args) => {
    
    
      args[0].minify = false;
      return args;
    });
  },

Todo el contenido de vue.config.js

const path = require("path");
// const CompressionWebpackPlugin = require("compression-webpack-plugin");
// // 定义压缩文件类型
// const productionGzipExtensions = ["js", "css"];
// let timeStamp = new Date().getTime();

function resolve(dir) {
    
    
  return path.join(__dirname, dir);
}
module.exports = {
    
    
  // 基本路径
  publicPath: "./",
  // 输出文件目录 不写则默认根目录
  outputDir: "dist",
  assetsDir: "static", // 静态资源目录 (js, css, img, fonts)
  lintOnSave: false,
  // eslint-loader 是否在保存的时候检查
  // lintOnSave: 'error',
  // devServer: {
    
    
  //   // development server port 8000
  //   port: 8000,
  //   // If you want to turn on the proxy, please remove the mockjs /src/main.jsL11
  //   proxy: {
    
    
  //     '/api/': {
    
    
  //       target: process.env.VUE_APP_APIUrl,
  //       changeOrigin: true
  //     }
  //   }
  // },
  // /assets/style/public.css.less
  css: {
    
    
    loaderOptions: {
    
    
      less: {
    
    
        lessOptions: {
    
    
          modifyVars: {
    
    
            // 或者可以通过 less 文件覆盖(文件路径为绝对路径)
            hack: `true; @import "@/assets/style/theme.less";`,
          },
        },
      },
    },
  },
  devServer: {
    
    
    // 设置主机地址
    // 设置默认端口
    port: 8080,
    // // 设置代理
    // proxy: {
    
    
    //   "/": {
    
    
    //     // target: "http://198.166.21.56:8080/",
    //     ws: true, // 支持ws协议;websocket的缩写;
    //     changeOrigin: true, // 是否跨域
    //     pathRewrite: {
    
    
    //       // 路径替换
    //       "^/api": "",
    //     },
    //   },
    // },
   
  },
  // use the full build with in-browser compiler?
  // https://vuejs.org/v2/guide/installation.html#Runtime-Compiler-vs-Runtime-only
  // compiler: false,

  // webpack配置
  // see https://github.com/vuejs/vue-cli/blob/dev/docs/webpack.md   webpack链接API,用于生成和修改webapck配置
  //部署打包html带引号
  chainWebpack: (config) => {
    
    
    config.resolve.alias.set("@", resolve("src"));
    config.plugin("html").tap((args) => {
    
    
      args[0].minify = false;
      return args;
    });
  },
  //压缩打包文件大小
  configureWebpack: (config) => {
    
    
    if (process.env.NODE_ENV === "Production") {
    
    
      // config.output.filename = `assets/js/[name].${timeStamp}.js`;
      // config.output.chunkFilename = `assets/js/[name].${timeStamp}.js`;
      config.plugins.push(
        new CompressionWebpackPlugin({
    
    
          algorithm: "gzip",
          test: new RegExp("\\.(" + productionGzipExtensions.join("|") + ")$"),
          threshold: 10240,
          minRatio: 0.8,
        })
      );
    }
    config.externals = {
    
    
      //   'vue': 'Vue',
      //   'vuex': 'Vuex',
      //   'vue-router': 'VueRouter',
      //   'element-ui': 'ELEMENT',
      //   'Axios': 'axios',
      //   'jquery': '$',
      //   'moment': 'moment',
      //   'js-cookie': 'Cookies',
      //   'echarts': 'echarts',
      //   'tinymce/tinymce': 'tinymce'
    };
    // }
  },
  // configureWebpack: (config) => {// webpack配置,值位对象时会合并配置,为方法时会改写配置
  //   if (debug) { // 开发环境配置
  //     config.devtool = 'cheap-module-eval-source-map'
  //   } else { // 生产环境配置

  //   }
  //   Object.assign(config, { // 开发生产共同配置
  //     resolve: {
    
    
  //       alias: {
    
    
  //         '@': path.resolve(__dirname, './src')//设置路径别名
  //         //...
  //       }
  //     }
  //   })
  // },
  // vue-loader 配置项
  // https://vue-loader.vuejs.org/en/options.html
  // vueLoader: {},

  // 生产环境是否生成 sourceMap 文件
  productionSourceMap: false,
  // css相关配置 配置高于chainWebpack中关于css loader的配置
  // css: {
    
    
  //   // 是否使用css分离插件 ExtractTextPlugin
  //   extract: true,
  //   // 开启 CSS source maps?是否在构建样式地图,false将提高构建速度
  //   sourceMap: false,
  //   // css预设器配置项
  //   loaderOptions: {},
  //   // 启用 CSS modules for all css / pre-processor files.
  //   modules: false
  // },
  // use thread-loader for babel & TS in production build
  // enabled by default if the machine has more than 1 cores 构建时开启多进程处理babel编译
  //parallel: require('os').cpus().length > 1,
  // 是否启用dll
  // See https://github.com/vuejs/vue-cli/blob/dev/docs/cli-service.md#dll-mode
  // dll: false,

  // PWA 插件相关配置
  // see https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-pwa
  //pwa: {},
  // webpack-dev-server 相关配置
  // devServer: {
    
    
  //   open: process.platform === 'darwin',
  //   host: '0.0.0.0',
  //   port: 8080,
  //   https: false,
  //   hotOnly: false,
  //   proxy: null, // 设置代理
  //   before: app => { }
  // },
  // 第三方插件配置
  pluginOptions: {
    
    
    // ...
  },
};

lintOnSave: false,Esto significa desactivar la revisión gramatical, de lo contrario habrá muchos errores y no funcionará.En
el directorio first-vue, cree un nuevo .postcssrc.js y configure postcss en él.

module.exports = {
    
    
  plugins: {
    
    
    //...
    autoprefixer: {
    
    
      browsers: ["Android >= 4.0", "iOS >= 7"],
    },
    "postcss-pxtorem": {
    
    
      rootValue: 37.5, //vant-UI的官方根字体大小是37.5
      propList: ["*"],
    },
  },
};

Adaptación de la zona de seguridad inferior
Configure la adaptación de la zona de seguridad inferior en el archivo index.html en el directorio público

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta base="/" id="base" />
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, viewport-fit=cover,user-scalable=no"
    />

    <link rel="icon" href="<%= BASE_URL %>favicon.ico" />
    <title>首页</title>
  </head>

  <body>

    <!-- 开启顶部安全区适配 -->
    <van-nav-bar safe-area-inset-top />
    <div id="app"></div>
    <!-- built files will be auto injected -->
    <!-- 开启底部安全区适配 -->
    <van-number-keyboard safe-area-inset-bottom />
  </body>
</html>
<script>
  
</script>

En el directorio src, cree un nuevo directorio de enrutador, cree un nuevo index.js a continuación y configure el enrutador

import Vue from "vue";
//路由
import VueRouter from "vue-router";
import {
    
     asyncRouterMap } from "@/config/router.config";
Vue.use(VueRouter);
const routes = []
  const router = new VueRouter({
    
    
    routes: routes.concat(asyncRouterMap),
   
    mode: "hash",
  });
  
  export default router;

En el directorio de configuración de src, cree un nuevo router.config, que corresponde a la ruta y la página correspondiente

export const asyncRouterMap = [
  {
    
    
    path: "/",
    component: () => import("@/components/Header.vue"),
    meta: {
    
     title: "首页" },
    // redirect: '/dashboard/workplace',
    redirect: "/home",
    children: [
      {
    
    
        path: "/home",
        name: "home",
        component: () => import("@/views/Home.vue"),
        hidden: true,
        meta: {
    
     title: "首页" },
      },
      {
    
    
        path: "/second",
        name: "second",
        component: () => import("@/views/Second.vue"),
        hidden: true,
        meta: {
    
     title: "第二页" },
      },
     
    ],
  },
  {
    
    
    path: "*",
    redirect: "/home",
    hidden: true,
  },
];

La página específica se creará más tarde
para modificar App.vue

<template>
  <div id="app">
    <router-view></router-view>
  </div>
</template>

<script>

export default {
    
    
  name: 'App',

}
</script>

<style>
#app {
    
    
  height: 100%;
}
.el-header,
.el-footer {
    
    
  background-color: #b3c0d1;
  color: #333;
  text-align: center;
  line-height: 60px;
}

body > .el-container {
    
    
  margin-bottom: 40px;
}
</style>

Ahora necesito encapsular un componente de encabezado, porque cada página tiene una barra de navegación de encabezado, por lo que se encapsula en un componente
En el directorio de componentes, cree un nuevo Header.vue

<template>
  <div class="phoneContant">
    <header>
  
      <van-nav-bar
        class="personheader"
        :fixed="true"
        :placeholder="true"
        :safe-area-inset-top="true"
        :title="$route.meta.title"
        left-text=""
        :left-arrow="true"
        @click-left="back"
      />
    </header>
        <router-view></router-view>
  </div>
</template>

<script>

var config = {
    
    
  isAndroid: /Android/i.test(navigator.userAgent), //判断是否为移动端
  isIos: !!navigator.userAgent.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //判断是否为IOS
};

export default {
    
    
  name: "Headers",
  //import引入的组件需要注入到对象中才能使用
  components: {
    
    },
  data() {
    
    
    //这里存放数据
    return {
    
    
      title: "",
    };
  },
  //监听属性 类似于data概念
  computed: {
    
    },
  //监控data中的数据变化
  watch: {
    
    
    $route: {
    
    
      handler(newRouter, fromRouter) {
    
    
      
      },
      immediate: true,
    },
  },
  //方法集合
  methods: {
    
    
    back() {
    
    
    this.$router.go(-1);
    
      return false;
    },
  },
  //生命周期 - 创建完成(可以访问当前this实例)
  created() {
    
    
    let cont = window.history.length;
    console.log("window.history.length-----------------roomstep");
    console.log(cont);
  },
  //生命周期 - 挂载完成(可以访问DOM元素)
  mounted() {
    
    
    
  },
  beforeCreate() {
    
    }, //生命周期 - 创建之前
  beforeMount() {
    
    }, //生命周期 - 挂载之前
  beforeUpdate() {
    
    }, //生命周期 - 更新之前
  updated() {
    
    }, //生命周期 - 更新之后
  beforeDestroy() {
    
    }, //生命周期 - 销毁之前
  destroyed() {
    
    
  
  }, //生命周期 - 销毁完成
  activated() {
    
    }, //如果页面有keep-alive缓存功能,这个函数会触发
};
</script>

Introducir estilos vant y css, y otros componentes en main.js

import Vue from 'vue'
import App from './App.vue'
import "@/assets/style/public.css";
import router from "@/router";
import Vant from "vant";
import "vant/lib/index.less";
import "@/assets/style/public.css";
Vue.config.productionTip = false
Vue.use(Vant);

new Vue({
    
    
  router,
  render: h => h(App),
}).$mount('#app')

Cree una carpeta de vistas en src, cree dos nuevos vue, Home.vue y Second.vue, el contenido es muy simple
Home.vue

<template>

  <div class="phoneContant">
    <van-button type="warning" @click="goToNext">进入下一页</van-button>
  </div>
</template>

<script>

export default {
    
    
  name: "Home",
  data() {
    
    
    return {
    
    
      msg: "我是首页",
    };
  },
  methods: {
    
    
    goToNext() {
    
    
      this.$router.push("/second");
    },

  },
};
</script>

<style>
</style>

Segunda vista


<template>
<div>
    {
    
    {
    
    msg}}
</div>
  
</template>

<script>
export default {
    
    
    data(){
    
    
        return{
    
    
            msg:"第二页"
        }
    }
}
</script>

<style>

</style>

correr

entrada de línea de comando

npm ejecutar servir

Si no hay problema, funcionará. Si desea interrumpir la operación, use la tecla de atajo ctrl+c en la terminal
inserte la descripción de la imagen aquí

encapsulación de red

Paquete axios para facilitar su uso. Cree una nueva carpeta de utils en src, cree un nuevo request.js en utils,

import axios from "axios";
import {
    
     Notify } from "vant";
import router from "@/router";

const baseURL =BaseUrl
  // process.env.NODE_ENV === "development" ? "/api" : window.productionUrl;
//创建axios实例
const service = axios.create({
    
    
  baseURL, // api的base_url  window.productionUrl
  withCredentials: true,
  timeout: 30000, // 请求超时时间
});

// 发送请求拦截器
service.interceptors.request.use(
  (config) => {
    
    
    const Nonce =
      Math.ceil(+new Date() / 1000) + "" + Math.ceil(Math.random() * 10000);
    const CurTime = Math.floor(+new Date() / 1000).toString();
    config.headers["Content-Type"] = "application/json;charset=UTF-8";

    return config;
  },
  (error) => {
    
    
    return Promise.reject(error);
  }
);

//发送请求响应拦截
service.interceptors.response.use(
  (response) => {
    
    
    const res = JSON.parse(CryptoJS.decrypt(response.data));
    // 错误的status情况
    // console.log(res);
    if (!res.result) {
    
    
      Notify({
    
     type: "danger", message: res.message || "error" });
      return Promise.reject(res.message || "error");
    } else {
    
    
      return res;
    }
  },
  (error) => {
    
    
    Notify({
    
     type: "danger", message: error.message || "error" });
    return Promise.reject(error);
  }
);

export default service;

epílogo

Ahora el proyecto está recién construido. Si no faltan pasos, debería poder ejecutarse. Todavía queda mucho trabajo por hacer. . .

Reponer

El orden del método de creación de proyectos anterior debería ser incorrecto. No es crear una carpeta primero, luego abrirla con vscode y luego ejecutar el comando vue create. En este caso, habrá un subdirectorio debajo del directorio principal, y el subdirectorio es el nombre del proyecto. Si desea que el directorio principal sea el proyecto, debe crear el proyecto ahora, abrir la línea de comando cmd, ejecutar el comando y luego abrirlo con vscode
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/jifashihan/article/details/124659000
Recomendado
Clasificación