Skip to content

移动端适配方案postcss-px-to-viewport-8-plugin

详情:postcss-px-to-viewport-8-plugin - 简书 (jianshu.com)

image-20230708220450633

js
#安装
yarn add postcss-px-to-viewport-8-plugin -D
#配置项
           postcsspxtoviewport({
            unitToConvert: 'px', // 需要转换的单位,默认为"px"
            viewportWidth: 750, // 设计稿的视口宽度
            unitPrecision: 5, // 单位转换后保留的精度
            propList: ['*'], // 能转化为vw的属性列表
            viewportUnit: 'vw', // 希望使用的视口单位
            fontViewportUnit: 'vw', // 字体使用的视口单位
            selectorBlackList: [], // 需要忽略的CSS选择器,不会转为视口单位,使用原有的px等单位。
            minPixelValue: 1, // 设置最小的转换数值,如果为1的话,只有大于1的值会被转换
            mediaQuery: false, // 媒体查询里的单位是否需要转换单位
            replace: true, //  是否直接更换属性值,而不添加备用属性
            exclude: undefined, // 忽略某些文件夹下的文件或特定文件,例如 'node_modules' 下的文件
            include: undefined, // 如果设置了include,那将只有匹配到的文件才会被转换
            landscape: false, // 是否添加根据 landscapeWidth 生成的媒体查询条件 @media (orientation: landscape)
            landscapeUnit: 'vw', // 横屏时使用的单位
            landscapeWidth: 1920 // 横屏时使用的视口宽度
          })

pm2本地部署

js
#安装
pnpm i pm2 -g
//在打包后的dist目录下
# pm2 serve 单页面应用需要添加--spa 目录 端口  --name 服务名称
pm2 serve --spa ./ 8080 --name test
# 查看服务列表
pm2 list
# 删除服务
pm2 delete test

pinia持久化插件

js
#安装
pnpm i pinia-plugin-persistedstate

#在storeS/index.ts中引入并使用
import { createPinia } from 'pinia'
import persist from 'pinia-plugin-persistedstate'
const pinia = createPinia()
pinia.use(persist)
//导出的仓库
export * from './modules/hospitalDetail'
export default pinia

#配置仓库
export const useUserStore = defineStore('cp-user',() => {
    const user = ref<User>()
    return { user }
  },
  { persist: true }
)

vue3在script标签上添加name方便调试插件

js
#安装
pnpm i vite-plugin-vue-setup-extend -D

#配置vite.config.ts
// 安装的插件
import VueSetupExtend from 'vite-plugin-vue-setup-extend'
 
export default defineConfig({
  plugins: [ VueSetupExtend() ]
})

#直接在.vue文件中的script上添加name使用
<script setup lang="ts" name="Login">
    //内部一定要有内容 注释也行
</script>

局域网文件共享

js
#安装
npm install http-server -g
#共享 
http-server

VSCode-setting.json配置文件

json
{
  // -------------------------------------------------以下为系统配置-------------------------------------------------
  "editor.cursorBlinking": "phase", // 光标闪烁方式
  "editor.cursorSmoothCaretAnimation": "on", // 光标平滑动画
  "editor.mouseWheelZoom": true, // 启用鼠标滚轮缩放
  "editor.formatOnPaste": true, // 粘贴时自动格式化
  "editor.formatOnType": true, // 输入时自动格式化
  "eslint.format.enable": true, // 启用 ESLint 格式化
  "editor.inlineSuggest.enabled": true, // 启用内联建议
  "editor.tabCompletion": "on", // 启用 Tab 补全
  "editor.linkedEditing": true, // 启用链接编辑
  "editor.bracketPairColorization.independentColorPoolPerBracketType": true, // 括号颜色独立池
  "vue.autoInsert.dotValue": true, // Vue 文件中插入属性时自动插入点value
  "vue.updateImportsOnFileMove.enabled": true, // 文件移动时更新导入路径
  "editor.codeActionsOnSave": {
    "source.fixAll": "explicit"
  },
  "tabnine.experimentalAutoImports": true, // 启用 TabNine 实验性自动导入
  "editor.formatOnSave": true, // 保存时自动格式化
  "explorer.confirmDelete": false, // 删除文件夹时不显示确认提示
  "files.insertFinalNewline": true, // 插入文件末尾的新行
  "editor.defaultFormatter": "esbenp.prettier-vscode", // 默认代码格式化工具
  "emmet.triggerExpansionOnTab": true, // 启用 Emmet Tab 触发扩展
  "workbench.list.smoothScrolling": true, // 左侧文件列表平滑滚动
  "terminal.integrated.smoothScrolling": true, // 终端平滑滚动
  "editor.smoothScrolling": true, // 编辑器平滑滚动
  "files.autoSave": "afterDelay", // 自动保存设置
  "window.commandCenter": true, // 启用命令中心
  "terminal.integrated.defaultProfile.windows": "PowerShell", // 默认终端配置
  "liveServer.settings.donotShowInfoMsg": true, // 不显示 Live Server 信息提示
  "editor.unicodeHighlight.nonBasicASCII": false, // 非基本 ASCII 字符不高亮显示
  "template-string-converter.addBracketsToProps": true, // 在模板字符串中添加大括号到 props
  "template-string-converter.autoRemoveTemplateString": true, // 自动移除模板字符串
  "template-string-converter.convertOutermostQuotes": true, // 转换最外层引号
  "template-string-converter.validLanguages": [
    // 支持的语言列表
    "svelte",
    "typescript",
    "javascript",
    "typescriptreact",
    "javascriptreact",
    "vue"
  ],

  // -------------------------------------------------以下为 UniApp 配置-------------------------------------------------
  "uniapp-run.HBuilderX": "D:\\Program Files\\HBuilderX", // HBuilderX 路径配置
  "uniapp-run.wxDevtool": "E:\\Program Files (x86)\\Tencent\\微信web开发者工具", // 微信开发者工具路径配置
  "create-uniapp-view.directory": true, // 创建 UniApp 页面时包含目录
  "create-uniapp-view.name": "与文件夹同名", // 创建 UniApp 页面时使用与文件夹同名
  "minapp-vscode.disableAutoConfig": true, // 禁用自动配置
  "files.associations": {
    // 文件类型关联
    "*.cjson": "jsonc", // .cjson 文件关联到 JSON 格式
    "*.wxss": "css", // .wxss 文件关联到 CSS 格式
    "*.wxs": "javascript", // .wxs 文件关联到 JavaScript 格式
    "manifest.json": "jsonc", // manifest.json 文件关联到 JSON 格式
    "pages.json": "jsonc" // pages.json 文件关联到 JSON 格式
  },
  "emmet.includeLanguages": {
    "javascript": "javascriptreact",
    "wxml": "html",
    "vue-html": "html"
  },

  // -------------------------------------------------以下为 GitHub 配置-------------------------------------------------
  "github.copilot.enable": {
    // GitHub Copilot 启用设置
    "*": true, // 启用 Copilot 对所有语言的支持
    "plaintext": false, // 禁用 Copilot 对纯文本文件的支持
    "markdown": false, // 禁用 Copilot 对 Markdown 文件的支持
    "scminput": false // 禁用 Copilot 对 SCM 输入字段的支持
  },
  // "gitblame.inlineMessageEnabled": true, // 启用 Git Blame 内联消息
  // "gitblame.inlineMessageFormat": "${author.name}, (${time.ago}) · ${commit.summary}",

  // -------------------------------------------------以下为 Prettier 配置-------------------------------------------------
  "prettier.endOfLine": "auto",
  "[vue]": {
    // 声明.vue 文件采用 prettier-vscode 插件进行代码格式化
    "editor.defaultFormatter": "dbaeumer.vscode-eslint"
  },
  "[html]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[less]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[json]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[typescript]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[javascript]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[typescriptreact]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[scss]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[jsonc]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "prettier.semi": false,
  "prettier.singleQuote": true,
  "prettier.bracketSpacing": true, // 对象括号两边是否用空格隔开
  "prettier.arrowParens": "avoid",
  "prettier.jsxSingleQuote": true,
  "diffEditor.ignoreTrimWhitespace": false
}

Eslint配置相关

js
/* eslint-env node */
require('@rushstack/eslint-patch/modern-module-resolution')

module.exports = {
  root: true,
  extends: [
    'plugin:vue/vue3-essential',
    'eslint:recommended',
    '@vue/eslint-config-typescript',
    '@vue/eslint-config-prettier/skip-formatting'
  ],
  parserOptions: {
    ecmaVersion: 'latest'
  },
  rules: {
    'prettier/prettier': [
      'warn',
      {
        singleQuote: true, //单引号
        semi: false, //没有分号
        printWidth: 80, //,行宽度80字符
        trailingComma: 'none', //没有对象数组最后一个逗号
        endOfLine: 'auto' //换行字符串自动
      }
    ],
    //忽略组件名字必须驼峰
    'vue/multi-word-component-names': [
      'warn',
      {
        //忽略必须指定到index文件
        ignores: ['index']
      }
    ],
    //忽略结构失去响应式报错
    'vue/no-setup-props-destructure': ['off'],
    // 💡 添加未定义变量错误提示,create-vue@3.6.3 关闭,这里加上是为了支持下一个章节演示。
    'no-undef': 'error'
  }
}

image-20231117200903831

输出代码执行所需时间

js
console.time('服务器启动时间');
server.listen(3000, () => { 
    console.log('express服务器启动成功');
})
console.timeEnd('服务器启动时间');

nodejs快速模拟接口

准备步骤

js
pnpm init   #初始化项目
pnpm i express	#安装express脚手架
pnpm i cors	#安装解决跨域插件
pnpm i body-parser	#安装可解析body传参的插件

主文件app.js

js
// 导入 express 模块
const express = require('express')
// 创建 express 的服务器实例
const app = express()

// 导入 cors 中间件
const cors = require('cors')
// 将 cors 注册为全局中间件
app.use(cors())
app.use(express.urlencoded({ extended: false }))

const bodyParser = require('body-parser');//导入解析body数据的中间件
app.use(bodyParser.json()); // 解析 JSON 格式的请求体

const router = require('./router.js')
app.use('/api',router)



// 调用 app.listen 方法,指定端口号并启动web服务器
app.listen(3007, function () {
  console.log('运行成功,后端地址:http://127.0.0.1:3007')
})

接口配置router.js

js
const express = require('express')
// 创建路由对象
const router = express.Router()

router.get('/getdata', (req, res) => {
    console.log(req.query)//获取直接在地址栏上输入的参数
    console.log(req.body)//获取post请求的参数x-www-form-urlencoded
    const data = {
        name: 'zs',
        age: 22
    }
  res.send(data)
})

router.get('/getdata/:id', (req, res) => {
    console.log(req.params)//获取直接在地址栏上输入的参数/:id
    const data = {
        name: 'zs',
        age: 22
    }
    //两秒后返回数据给前端
  setTimeout(() => {
    res.send(data)
  }, 2000)
})

// 将路由对象共享出去
module.exports = router

运行

js
nodemon app.js

vite配置全局less或者scss

image-20240303220712018

js
  css: {
    preprocessorOptions: {
      less: {
        modifyVars: {
          '@color-primary-1': '#2F80ED',
          'hack': `true; @import (reference) "${resolve('src/assets/style/breakpoint.less')}"; @import (reference) "${resolve('src/assets/style/var.less')}";`,
        },
        javascriptEnabled: true,
      },
      scss: {
        additionalData: `$color-primary-1: #2F80ED;@import '/src/assets/style/var.scss';@import '/src/assets/style/breakpoint.scss';`,
      },
    },
  },

修改主题色

js
document.body.style.setProperty(`--primary-6`, rgbColor);

webpack

是一个现代的静态模块打包工具。Webpack的主要目标是将多个文件(如 JavaScript、CSS、图片等)打包成一个或多个静态资源文件,以便于在浏览器中加载。

loader和Plugin区别

Loader 直译为"加载器"。webpack 将一切文件视为模块,但是 webpack 原生是只能 解析 js 文件,如果想将其他文件也打包的话,就会用到 loader。 所以 Loader 的作用是让 webpack 拥有了加载和解析非 JavaScript 文件的能力。Loader 在 module.rules 中配置。

Plugin 直译为"插件"可以扩展 webpack 的功能,让 webpack 具有更多的灵 活性主要目的就是解决loader 无法实现的事情,比如打包优化和代码压缩等。

js
//webpack.config.js
const htmlWebpackPlugin = require('html-webpack-plugin');//引入html-webpack-plugin插件
const path = require('path');//引入path模块 用于处理路径问题
module.exports = {
    resolve: {//解析
        alias: {//别名
            '@': path.resolve(__dirname, 'src')//配置@路径为src
        }
    },
    //当前文件位置 文件夹名 文件名
    entry: path.join(__dirname, 'src', 'main.js'),//入口文件
    output: {
        filename: 'main.js',//打包后的文件名
        path: path.resolve(__dirname, 'demo'),//打包后的文件路径
        clean: true,//打包前清理文件夹
    },
    //插件配置
    plugins: [new htmlWebpackPlugin({
        template: path.join(__dirname, 'public', 'index.html'),//指定模板文件
    })],
    module: {//加载器配置
        rules: [//规则
            {
                test: /\.css$/i,// 匹配css文件
                use: ['style-loader', 'css-loader'],//使用从后往前的顺序解析css和插入到html中
            },
            //less加载器
            {
                test: /\.less$/i,// less
                use: ['style-loader', 'css-loader', 'less-loader'],//使用从后往前的顺序解析css和插入到html中
            },
            //图片加载器
            {
                test: /\.(png|jpg|jpeg|gif)$/i,//图片加载器
                type: 'asset',//大于8kb的图片会被打包成文件,小于8kb的图片会被打包成base64格式
                generator: {//输出文件名,路径+名字
                    filename: 'assets/[hash][ext]'
                },
            },
            //语法降级
            {
                test: /\.m?js$/,
                exclude: /(node_modules|bower_components)/, // 排除指定目录里的 js (不进行编译降级)
                use: {
                    loader: 'babel-loader',
                    options: {
                        presets: ['@babel/preset-env'] // 预设规则
                    }
                }
            }
        ]
    }
}

//依赖  package.json
 "devDependencies": {
    "@babel/core": "^7.23.5",
    "@babel/preset-env": "^7.23.5",
    "babel-loader": "^9.1.3",
    "css-loader": "^6.8.1",
    "html-webpack-plugin": "^5.5.3",
    "less": "^4.2.0",
    "less-loader": "^11.1.3",
    "style-loader": "^3.3.3",
    "webpack": "^5.89.0",
    "webpack-cli": "^5.1.4",
    "webpack-dev-server": "^4.15.1"
  },