小满Vue3第三十六章(Vue如何开发移动端)

news2025/2/24 23:17:09

视频教程Vue3 + vite + Ts + pinia + 实战 + 源码 +全栈_哔哩哔哩_bilibili

如果使用npm init vue@latest 报错

error when starting dev server: Error: Cannot find module 'node:path'

nodejs 升级为16版本就好了

开发移动端最主要的就是适配各种手机,为此我研究了一套解决方案

在之前我们用的是rem 根据HTML font-size 去做缩放

现在有了更好用的vw vh

vw 视口的最大宽度,1vw等于视口宽度的百分之一

vh 视口的最大高度,1vh等于视口高度的百分之一

1.安装依赖


npm install postcss-px-to-viewport -D

因为vite中已经内联了postcss,所以并不需要额外的创建 postcss.config.js文件

vite.config.ts

import { fileURLToPath, URL } from 'url'

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueJsx from '@vitejs/plugin-vue-jsx'
import postcsspxtoviewport from "postcss-px-to-viewport" //插件
// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue(), vueJsx()],
  css: {
    postcss: {
      plugins: [
        postcsspxtoviewport({
          unitToConvert: 'px', // 要转化的单位
          viewportWidth: 750, // UI设计稿的宽度
          unitPrecision: 6, // 转换后的精度,即小数点位数
          propList: ['*'], // 指定转换的css属性的单位,*代表全部css属性的单位都进行转换
          viewportUnit: 'vw', // 指定需要转换成的视窗单位,默认vw
          fontViewportUnit: 'vw', // 指定字体需要转换成的视窗单位,默认vw
          selectorBlackList: ['ignore-'], // 指定不转换为视窗单位的类名,
          minPixelValue: 1, // 默认值1,小于或等于1px则不进行转换
          mediaQuery: true, // 是否在媒体查询的css代码中也进行转换,默认false
          replace: true, // 是否转换后直接更换属性值
          landscape: false // 是否处理横屏情况
        })
      ]
    }
  },
  resolve: {
    alias: {
      '@': fileURLToPath(new URL('./src', import.meta.url))
    }
  }
})

如果你用的vite 是 ts 他这个插件并没有提供声明文件我已经帮大家写好了声明文件(良心)

declare module 'postcss-px-to-viewport' {

    type Options = {
        unitToConvert: 'px' | 'rem' | 'cm' | 'em',
        viewportWidth: number,
        viewportHeight: number, // not now used; TODO: need for different units and math for different properties
        unitPrecision: number,
        viewportUnit: string,
        fontViewportUnit: string,  // vmin is more suitable.
        selectorBlackList: string[],
        propList: string[],
        minPixelValue: number,
        mediaQuery: boolean,
        replace: boolean,
        landscape: boolean,
        landscapeUnit: string,
        landscapeWidth: number
    }

    export default function(options: Partial<Options>):any
}

引入声明文件 tsconfig.app postcss-px-to-viewport.d.ts跟vite.ts同级

{
  "extends": "@vue/tsconfig/tsconfig.web.json",
  "include": ["env.d.ts", "src/**/*", "src/**/*.vue", "postcss-px-to-viewport.d.ts"],
  "exclude": ["src/**/__tests__/*"],
  "compilerOptions": {
    "composite": true,
    "baseUrl": ".",
    "paths": {
      "@/*": ["./src/*"]
    }
  }
}

代码案例

<template>
  <div class="wraps">
    <header class="header">
      <div>left</div>
      <div>中间</div>
      <div>right</div>
    </header>

    <main class="main">
      <div class="main-items" v-for="item in 100">
        <div class="main-port">头像</div>
        <div class="main-desc">
          <div>小满{{item}}</div>
          <div>你妈妈喊你回家穿丝袜啦</div>
        </div>
      </div>
    </main>


    <footer class="footer">
      <div class="footer-items" v-for="item in footer">
        <div>{{ item.icon }}</div>
        <div>{{ item.text }}</div>
      </div>
    </footer>
  </div>

</template>
  
<script setup lang='ts'>
import { reactive } from 'vue';

type Footer<T> = {
  icon: T,
  text: T
}

const footer = reactive<Footer<string>[]>([
  {
    icon: "1",
    text: "首页"
  },
  {
    icon: "2",
    text: "商品"
  },
  {
    icon: "3",
    text: "信息"
  },
  {
    icon: "4",
    text: "我的"
  }
])
</script>
  
<style lang="less">
@import url('@/assets/base.css');

html,
body,
#app {
  height: 100%;
  overflow: hidden;
  font-size: 14px;
}

.wraps {
  height: inherit;
  overflow: hidden;
  display: flex;
  flex-direction: column;
}

.header {
  background-color: pink;
  display: flex;
  height: 30px;
  align-items: center;
  justify-content: space-around;

  div:nth-child(1) {
    width: 40px;
  }

  div:nth-child(2) {
    text-align: center;
  }

  div:nth-child(3) {
    width: 40px;
    text-align: right;
  }
}

.main {
  flex: 1;
  overflow: auto;

  &-items {
    display: flex;
    border-bottom: 1px solid #ccc;
    box-sizing: border-box;
    padding: 5px;
  }

  &-port {
    background: black;
    width: 30px;
    height: 30px;
    border-radius: 200px;
  }
  &-desc{
     margin-left:10px;
     div:last-child{
        font-size: 10px;
        color:#333;
        margin-top: 5px;
     }
  }
}

.footer {

  border-top: 1px solid #ccc;
  display: grid;
  grid-template-columns: 1fr 1fr 1fr 1fr;

  &-items {
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    padding: 5px;
  }
}
</style>

 基本适配百分之99的屏幕

如何将我们的Vue 项目打包成App(会安卓的可以跳过

1.安装JDK Java Downloads | Oracle

配置环境变量

JAVA_HOME

 

 CLASSPATH (下面的照抄就行)

.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;

 最后一个Path

添加 %JAVA_HOME%\bin

2.安卓编辑器下载地址(建议科学上网不然很慢)https://developer.android.com/

一直next 就行了 然后磁盘选一下 安装就可以了 

装完启动需要还需要安装sdk 然后就可以打开了

新建一个空项目选这个就可以了

 语言会java选java 会别的就选别的

 等待加载完成

打开之后可以创建一个虚拟机 

 创建完成之后就可以运行安卓项目

 其实就是一个虚拟手机

切换成代码模式

 修改成以下代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent">

    <WebView
        android:id="@+id/web_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout  >

 其实就是类似于我们前端的display felx 

 webView 就和小程序的webView 基本一样 套网页的

match_parent表示让当前控件的大小和父布局的大小一样,也就是让父布局来决定当前控件的大小

java 代码逻辑

package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import android.webkit.WebView;

import android.app.Activity;

import android.webkit.WebViewClient;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //设置一个Activity的显示界面,
        setContentView(R.layout.activity_main);

        WebView view = (WebView)findViewById(R.id.web_view);
        //设置 WebView 属性,能够执行 Javascript 脚本
        view.getSettings().setJavaScriptEnabled(true);
        //加载需要显示的网页 不能使用局域网地址 只能虚拟机专属地址 http://10.0.2.2 端口是我们vue 项目端口
        view.loadUrl("http://10.0.2.2:3000");

        view.setWebViewClient(new WebViewClient());
    }
}

加载需要显示的网页 不能使用局域网地址 只能虚拟机专属地址 http://10.0.2.2 端口是我们vue 项目端口

 配置权限

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.example.myapplication">

    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.MyApplication"
        android:usesCleartextTraffic="true"
        tools:targetApi="31">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
</manifest>

 

 你就可以看到我们的项目了

最后打包

打包的时候路径记得换成线上的服务器地址

 安卓手机实测

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/405674.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

让div居中的方式的几种方法

让div水平居中的方式的几种方法。 文章目录 一、margin二、绝对定位三、子元素绝对定位父元素相对定位四、flex布局总结 一、margin 第一种方式我们可以利用外边距属性来使div水平垂直居中 先来看一段有问题的代码 <!DOCTYPE html> <html lang"en"> &…

React框架创建项目详细流程-项目的基本配置-项目的代码规范

文章目录React创建项目流程与规范项目规范项目配置目录结构样式重置Router配置Redux状态管理axios配置React创建项目流程与规范 项目规范 项目规范: 在项目中都会有一些开发规范和代码风格, 下面介绍一下我采用的规范与风格 文件夹、文件名称统一小写、多个单词以连接符(-)连…

vue实战--vue+elementUI实现多文件上传+预览(word/PDF/图片/docx/doc/xlxs/txt)

需求 最近在做vue2.0element UI的项目中遇到了一个需求&#xff1a;需求是多个文件上传的同时实现文件的在线预览功能。需求图如下&#xff1a; 看到这个需求的时候&#xff0c;小栗脑袋一炸。并不知道该如何下手&#xff0c;之前的实践项目中也并没有遇到相似的功能。因此也…

webpack配置

webpack 前端工程化 实际的前端开发 模块化&#xff08;js 的模块化、css 的模块化、资源的模块化&#xff09; 组件化&#xff08;复用已有的 UI 结构、样式、行为&#xff09; 规范化&#xff08;目录结构的划分、编码规范化、接口规范化、文档规范化、Git 分支管理&…

【Web前端】CSS-盒子模型

文章目录一、盒子模型1、网页布局的本质2、盒子模型&#xff08;Box Model&#xff09;组成3、边框&#xff08;border&#xff09;3.1、边框的使用3.2、表格的细线边框3.3、边框会影响盒子实际大小4、内边距&#xff08;padding&#xff09;4.1、内边距的使用方式4.2、内边距会…

CSS响应式布局(自适应布局)

CSS 响应式布局也称自适应布局&#xff0c;是 Ethan Marcotte 在 2010 年 5 月份提出的一个概念&#xff0c;简单来讲就是一个网站能够兼容多个不同的终端&#xff08;设备&#xff09;&#xff0c;而不是为每个终端做一个特定的版本。这个概念是为解决移动端浏览网页而诞生的。…

一文弄懂Vue与Servlet的交互:让你的大学课设变得容易起来

文章目录1 写作动机2 准备工作3 前端请求3.1 get请求3.1.1 仿照网站栏撰写3.1.2 按照Parms格式传参3.2 Post请求3.2.1 按照Data格式传参3.2.2 按照Params格式传参3.3 一个特殊的点4 后端接收请求4.1 提要4.2 代码4.2.1 架子4.2.2 模块一&#xff1a;获取参数4.2.3 模块二&#…

【微信小程序】选择器组件picker

文章目录【微信小程序】选择器组件pickerpicker组件的定义picker组件的类型picker属性共同的属性时间选择器time参考【微信小程序】选择器组件picker picker组件的定义 picker组件是一种从底部向上弹起的滚动选择器。 picker组件的类型 在官方文档中&#xff0c;有提供五种…

【uni-app系列】uni-app之nvue使用

目录一、介绍二、新建 nvue 页面三、开发四、nvue 开发与 vue 开发的常见区别一、介绍 uni-app App 端内置了一个基于 weex 改进的原生渲染引擎&#xff0c;提供了原生渲染能力。 在 App 端&#xff0c;如果使用 vue 页面&#xff0c;则使用 webview 渲染&#xff1b;如果使用…

无界(wujie)微前端实现及三种通信方式介绍

一、对比 之前介绍过前段时间比较流行的微前端框架qiankun&#xff0c;虽然实现了微前端的理念&#xff0c;但是也暴露出很多缺点&#xff0c;比如官网上讲到的四点&#xff1a; 基于路由匹配&#xff0c;无法同时激活多个子应用&#xff0c;也不支持子应用保活改造成本较大&…

echarts:饼图标签formatter的使用/饼图自定义标签

需求描述 需要实现一个“五彩斑斓”的饼图&#xff1a;每块饼上的标签颜色与这块饼的颜色一致。 实现思路 要改变饼图标签的颜色&#xff0c;需要参考echarts饼图label配置项&#xff0c;以及这个很棒的官方示例&#xff1a;饼图引导线调整。从这个示例中可以了解到自定义标…

【Vue路由守卫】

Vue路由守卫Vue路由守卫全局路由守卫全局前置守卫全局后置守卫实例代码&#xff1a;独享守卫组件内守卫总结Vue路由守卫 路由守卫&#xff0c;简单理解来说就是&#xff0c;当用户要进行一些操作时&#xff0c;我需要用户的一些信息或数据或行为&#xff0c;我判断过后&#x…

【1024用代码改变世界】useMemo 和 useCallback|React.memo使用场景

欢迎来到我的博客 &#x1f4d4;博主是一名大学在读本科生&#xff0c;主要学习方向是前端。 &#x1f36d;目前已经更新了【Vue】、【React–从基础到实战】、【TypeScript】等等系列专栏 &#x1f6e0;目前正在学习的是&#x1f525;React/小程序React/小程序React/小程序&am…

【HTML+CSS】实现网页的导航栏和下拉菜单

熟练的使用导航栏,对于任何网站都非常重要,我们可以使用CSS转换为好看的导航栏而不是枯燥的HTML菜单。同时,我们使用 CSS 可以创建一个鼠标移动上去后显示下拉菜单的效果。 水平导航栏: 垂直导航栏: 文章目录 一.CSS导航栏1. HTML设置菜单项2. 垂直导航栏3. 水平导航栏3…

卸载,重新安装node

因为我的node版本比较低,需要换成高一点的版本,所以需要先卸载 卸载node 直接点卸载就可以了 重新安装 node下载网站:下载 | Node.js 中文网http://nodejs.cn/download/ 1 选择符合自己电脑的node(下载的的长期支持版本-这个比较稳定) 2 选择自己要安装的路径(最好自己选一…

前端练手3D爱心

文章目录盒子模型常用属性&#xff08;认识&#xff09;效果一 爱心半边效果二 爱心整合生成效果三 实现立方体爱心最终效果 3D爱心盒子模型常用属性&#xff08;认识&#xff09; overflow: hidden;定义盒子不随浮动 margin-left: 50px:使盒子距离外边距左(右上下)50px margin…

前端面试宝典~Symbol、相同的Set、Getter、控制动画、js中哪些操作会造成内存泄漏?等......

前端JavaScript面试题&#x1f353;&#x1f353;Symbol&#x1f353;&#x1f353;相同的Set&#x1f353;&#x1f353;Getter&#x1f353;&#x1f353;控制动画&#x1f353;&#x1f353;js中哪些操作会造成内存泄漏?html页面的骨架&#xff0c;相当于人的骨头&#xff…

vscode下载和安装教程和配置中文插件(超详细)

前言必读 读者手册&#xff08;必读&#xff09;_云边的快乐猫的博客-CSDN博客 前言&#xff1a; vscode主要是用于前端的编程工具&#xff0c;其他编程的语言也可以在vscode里面编程运行。 优点&#xff1a;简洁、占用内存小、界面美观 一、下载步骤 1.到官网根据自己的操…

vue里面使用pdfjs-dist+fabric实现pdf电子签章!!!

2022.9.6 一、需求 最近领导提了一个新需求&#xff1a;仿照e签宝&#xff0c;实现pdf电子签章&#xff01; 最终实现效果图 这是做出来的效果图&#xff0c;当然还有很多待修改 二、思路 然后我就去看了下人家e签宝的操作界面&#xff0c;左侧是印章&#xff0c;右侧是…

Vue 原理整理

目录 1. 组件化基础>&#xff08;MVVM模型&#xff09; 2. Vue的响应式原理 3.为什么在 Vue3.0 采用了 Proxy,抛弃了 Object.defineProperty&#xff1f; 4.computed 的实现原理 5. computed 和 watch 有什么区别及运用场景? 6. Vue 中的 key 到底有什么用&#xff…