vite创建移动端项目集成vant

370 阅读2分钟

创建项目并安装依赖

pnpm create vite vant-01
cd vant-01
pnpm install
pnpm add unplugin-auto-import unplugin-vue-components -D
pnpm prettier -D
pnpm add postcss postcss-pxtorem postcss-preset-env amfe-flexible -D

vant按需引入

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import path from 'path'
import { createStyleImportPlugin, VantResolve } from 'vite-plugin-style-import'
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { VantResolver } from 'unplugin-vue-components/resolvers'

function _resolve(dir: string) {
  return path.resolve(__dirname, dir)
}

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [
    vue(),
    createStyleImportPlugin({
      resolves: [VantResolve()],
      libs: [
        {
          libraryName: 'vant',
          esModule: true,
          resolveStyle: (name: string) => {
            // 必须使用es目录下的样式,否则自动引入样式文件的时候会缺失部分样式
            return `../es/${name}/style/index`
          },
        },
      ],
    }),
    AutoImport({
      resolvers: [VantResolver()],
    }),
    Components({
      resolvers: [VantResolver()],
    }),
  ],
  resolve: {
    alias: {
      '@': _resolve('src'),
    },
  },
})

配置prettier

.prettierrc

{
  "printWidth": 80,
  "semi": false,
  "singleQuote": true,
  "endOfLine": "lf",
  "tabWidth": 2,
  "trailingComma": "es5",
  "bracketSpacing": true,
  "arrowParens": "avoid"
}

配置postcss

postcss.config.cjs

postcss-preset-env自动增加css前缀

postcss-pxtorem将px转为rem

module.exports = {
  plugins: {
    'postcss-preset-env': {},
    'postcss-pxtorem': {
      rootValue: 37.5, //换算基数
      // rootValue({ file }) {
      //   // 如果设计稿的尺寸不是 375,而是 750 或其他大小,可以将 rootValue 配置调整为
      //   return file.indexOf('vant') !== -1 ? 37.5 : 75
      // },
      propList: ['*'],
      exclude: /(node_module)/, //默认false,可以(reg)利用正则表达式排除某些文件夹的方法,例如/(node_module)/ 。如果想把前端UI框架内的px也转换成rem,请把此属性设为默认值
      selectorBlackList: ['.van'], //要忽略并保留为px的选择器,本项目我是用的vant ui框架,所以忽略他
      mediaQuery: false, //(布尔值)允许在媒体查询中转换px。
      unitPrecision: 5, //允许REM单位增长到的十进制数字,小数点后保留的位数。
      minPixelValue: 1, //设置要替换的最小像素值
    },
  },
}

main.ts

// 省略代码...
import 'amfe-flexible'
// 省略代码...

index.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <link rel="icon" type="image/svg+xml" href="/vite.svg" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0, minimum-scale=1, maximum-scale=1, user-scalable=no, viewport-fit=cover"
    />
    <title>Vite + Vue + TS</title>
  </head>
  <!-- 因为 iOS Safari 默认不会触发 :active 伪类,解决方法是在 body 标签上添加一个空的 ontouchstart 属性。具体说明详见:https://stackoverflow.com/questions/3885018/active-pseudo-class-doesnt-work-in-mobile-safari/33681490#33681490 -->
  <body ontouchstart="">
    <div id="app"></div>
    <script type="module" src="/src/main.ts"></script>

    <script>
      // 禁止ios10+页面缩放: https://blog.csdn.net/qq_46003166/article/details/106851406
      const disabledScale = () => {
        var lastTouchEnd = 0
        document.addEventListener('touchstart', function (event) {
          if (event.touches.length > 1) {
            event.preventDefault()
          }
        })
        document.addEventListener(
          'touchend',
          function (event) {
            var now = new Date().getTime()
            if (now - lastTouchEnd <= 300) {
              event.preventDefault()
            }
            lastTouchEnd = now
          },
          false
        )

        // 阻止双指放大
        document.addEventListener('gesturestart', function (event) {
          event.preventDefault()
        })
      }

      disabledScale()
    </script>
  </body>
</html>

tsconfig.json

{
  "compilerOptions": {
    "target": "ESNext",
    "useDefineForClassFields": true,
    "module": "ESNext",
    "moduleResolution": "Node",
    "strict": true,
    "jsx": "preserve",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "esModuleInterop": true,
    "lib": ["ESNext", "DOM"],
    "skipLibCheck": true,
    "noEmit": true,
    "importHelpers": true, // 不让同样的辅助函数重复的出现在多个文件中
    "allowSyntheticDefaultImports": true, // 允许对不包含默认导出的模块使用默认导入。
    "types": ["vite/client"], // "element-plus/global", "jest", "pinia-plugin-persist"
    "baseUrl": ".", // 非相对模块的导入可以相对于baseUrl或通过下文会讲到的路径映射来进行解析
    "paths": {
      "@/*": ["src/*"]
    }
  },
  "include": ["src/**/*"],
  "references": [{ "path": "./tsconfig.node.json" }]
}

参考文章