创建和配置一个vue3项目

创建一个基本的vue3项目

https://www.cnblogs.com/huihuihero/p/12272594.html

版本更新需要:vue版本变更,Vue脚手架版本变更,如何全局使用及问题解决相关 
https://www.cnblogs.com/huihuihero/p/16312696.html

项目运行环境及版本号相关

需要 node14+ 版本,如果涉及到Node版本切换可以参考这个

https://www.cnblogs.com/huihuihero/p/16865904.html

开发过程体验

【导出的问题】构建的时候比较多的采用了export default,采用的是先将各个文件汇总到一个文件里再export default统一导出。以为管理起来较为方便。
实际开发过程中发现这种方式较为繁琐。对多人项目也不是很友好。
故建议根据情况优先选择各文件export直接导出即可,而非汇总后再用export default统一导出

项目目录配置-思维导图下载

https://files.cnblogs.com/files/huihuihero/vue3项目目录思维导图.zip

项目目录配置-图解

全局样式配置

https://www.cnblogs.com/huihuihero/p/16334463.html

开发环境、测试环境、正式环境配置

项目目录下新建三个文件夹
【.env.development】开发环境
VUE_APP_BASE_API=http://192.168.2.106/api    //根接口地址
VUE_APP_BASE_URL=https://www.development.com    //项目根地址
VUE_APP_ROUTER_MODE=hash    //路由模式history、hash
VUE_APP_PUBLIC_PATH=/    //域名根路径,如配置/demo/,则www.xxx.com配置后成www.xxx.com/demo/
VUE_APP_MODE=development    //哪种环境

【.env.testing】测试环境
VUE_APP_BASE_API=https://www.testing.com/api
VUE_APP_BASE_URL=https://www.testing.com
VUE_APP_ROUTER_MODE=hash
VUE_APP_PUBLIC_PATH=/
VUE_APP_MODE=testing

【.env.production】正式环境
VUE_APP_BASE_API=https://www.xxx.com/api
VUE_APP_BASE_URL=https://www.xxx.com
VUE_APP_ROUTER_MODE=history
VUE_APP_PUBLIC_PATH=/
VUE_APP_MODE=production

package.json里配置
"scripts": {
    "serve": "vue-cli-service serve --mode development",  //运行,采用运行环境配置
    "serve:test": "vue-cli-service serve --mode testing",  //运行,采用测试环境配置  执行yarn run serve:test 或 npm run serve:test
    "serve:prod": "vue-cli-service serve --mode production",  //运行,采用正式环境配置
    "build": "vue-cli-service build --mode production",  //打包,采用正式环境配置
    "build:test": "vue-cli-service build --mode testing",  //打包,采用测试环境配置
    "build:dev": "vue-cli-service build --mode development"  //打包,采用开发环境配置
  },

vue.config.js配置

参考1:https://blog.csdn.net/weixin_35773751/article/details/123414144

参考2:https://zhuanlan.zhihu.com/p/199438565

基本配置

const { defineConfig } = require("@vue/cli-service");
const path = require("path");

module.exports = defineConfig({
    transpileDependencies: true,
    devServer: {
        host: "0.0.0.0",
        port: 8008,
        // open: true,  //自动打开浏览器
    },
    pluginOptions: {
        "style-resources-loader": {
            preProcessor: "less",
            patterns: [path.resolve(__dirname, "./src/styles/index.less")],
        },
    },
    lintOnSave: false, //取消eslint检测
    productionSourceMap: false, //设为false可减小打包后包体积,默认为true
    publicPath: process.env.VUE_APP_PUBLIC_PATH, //配置域名根路径,如配置/demo/,则www.xxx.com配置后成www.xxx.com/demo/
    assetsDir: "static", //设置打包后静态资源放在static文件夹里
    outputDir: "dist",
});

接口请求及axios相关配置

https://www.cnblogs.com/huihuihero/p/16699954.html

使用iconfont

1、在assets文件夹下新建icons文件夹

2、从iconfont下载字体图标包(选择Font class格式下载)解压,然后把解压后所有文件复制到icons文件里即可

3、在main.js中引入:import './assets/icons/iconfont.css'
(若有报错,安装css-loader包)

4、使用:<div class="iconfont iconyiguoqi"></div>

index.html配置,包含滚动条美化

<!DOCTYPE html>
<html lang="" class="beauty-scroll">

<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="keywords" content="keyword1,keyword2"/> 
    <meta name="description" content="网站介绍"/>
    <!-- PC端配置 -->
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <!-- 移动端配置 -->
    <!-- <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0, minimum-scale=1.0,shrink-to-fit=no,user-scalable=no"> -->

    <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <title><%= htmlWebpackPlugin.options.title %></title>
    <style>
        .beauty-scroll {
            scrollbar-color: #5cdbd3 #f7f7f7;
            /* 第一个方块颜色,第二个轨道颜色(用于更改火狐浏览器样式) */
            scrollbar-width: thin;
            /* 火狐滚动条无法自定义宽度,只能通过此属性使滚动条宽度变细 */
            -ms-overflow-style: none;
            /* 隐藏滚动条(在IE和Edge两个浏览器中很难更改样式,固采取隐藏方式) */

            /* 以下是chrome浏览器自定义滚动条样式方式 */

        }

        .beauty-scroll ::-webkit-scrollbar {
            /*滚动条整体样式*/
            width: 4px;
            /*高宽分别对应横竖滚动条的尺寸*/
            height: 1px;
        }

        .beauty-scroll ::-webkit-scrollbar-thumb {
            /*滚动条里面小方块*/
            border-radius: 8px;
            -webkit-box-shadow: inset 0 0 1px rgba(0, 0, 0, 0);
            background: #5cdbd3;
        }

        .beauty-scroll ::-webkit-scrollbar-track {
            /*滚动条里面轨道*/
            -webkit-box-shadow: inset 0 0 1px rgba(0, 0, 0, 0);
            border-radius: 8px;
            background: #f7f7f7;
        }
    </style>
</head>

<body>
<body>
    <noscript>
        <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
    </noscript>
    <div id="app"></div>
</body>
    <div id="app"></div>
</body>

</html>

组件配置

https://www.cnblogs.com/huihuihero/p/16708391.html

语言切换配置-i18n@9.x

https://www.cnblogs.com/huihuihero/p/16717484.html

utils配置

【utils/index.js】
import languageUtil from "./language";
import terminalUtil from "./terminal"
import authUtil from "./auth"
import fileUtil from "./file"
import commonUtil from "./common"

export { 
    languageUtil,
    terminalUtil,
    authUtil,
    fileUtil,
    commonUtil
};



【utils/file/base64Deal.js】
const base64Deal = "base64相关";
export default base64Deal;



【utils/file/download.js】
const downloadVideo = "下载视频相关";
const downloadFile = "下载文件相关";
const downloadImg = "下载图片相关";

export {
    downloadVideo,
    downloadFile,
    downloadImg
};



【utils/file/index.js】
import base64Deal from "./base64Deal";
import { downloadVideo, downloadImg, downloadFile } from "./download";

export default {
    base64Deal,
    downloadVideo,
    downloadImg,
    downloadFile,
};


【util-use-demo.vue】
<script>
import { terminalUtil } from "@/utils/index";

export default {
    setup() {
        const ism = terminalUtil.isMobile;
        console.log(ism)
    },
};
</script>

路由配置

https://www.cnblogs.com/huihuihero/p/16723410.html

vuex配置

https://www.cnblogs.com/huihuihero/p/16730161.html

移动端适配

https://www.cnblogs.com/huihuihero/p/16918633.html

引入vant ui

1、yarn add vant 或 npm install vant --save

2、在main.js中
【全部引入】
import vant from "vant"
import "vant/lib/index.css"
app.use(vant)

【按需引入】
import { Button } from 'vant';
import 'vant/lib/index.css';
app.use(Button);

官网:https://vant-contrib.gitee.io/vant/#/zh-CN/

引入element ui

1、yarn add element-plus 或 npm install element-plus --save

2、在main.js中全部引入
import ElementPlus from 'element-plus' 
import 'element-plus/dist/index.css'
app.use(ElementPlus)

官网:https://element-plus.gitee.io/zh-CN/guide/installation.html

附最终配置完成后的main.js文件代码(附两种格式规范)

第一种格式规范

import { createApp } from "vue";
import App from "./App.vue";
const app = createApp(App); //创建vue实例

import { setupComponents } from "@/components/index"; //全局组件引入
import { setupRouter } from "@/router/index"; //路由
import { setupStore } from "./store"; //vuex
import { setupI18n } from "@/language/index"; //i18n语言切换

const setStyles = () => import("@/styles/index.less"); //引入公用样式
const setIconfont = () => import("@/assets/icons/iconfont.css"); //iconfont

/**
 * 移动端适配--lib-flexible,↓↓↓
 * 注释:这里为什么不像上面setStyles那样先const xx=()=>import("@/xx/xx")引入,而是采用import "@/xx/xx"的格式引入。
 * 因为setStyles那种import("@/xx")是动态加载,和import "@/xx"是有区别的。而这个lib-flexible需要先引入后生效,动态引入会导致引入和生效的顺序问题,效果不是很理想。
 * 动态引入和静态引入具体区别见:https://www.cnblogs.com/huihuihero/p/16921002.html
 */
import "lib-flexible/flexible.js";

async function setupApp() {
    setStyles();
    setIconfont();
    setupComponents(app);
    setupRouter(app);
    setupStore(app);
    await setupI18n(app); //异步案例:语言文件可能从服务器端获取

    app.mount("#app");
}

setupApp();

第二种格式规范

import { createApp } from "vue";
import App from "./App.vue";
const app = createApp(App); //创建vue实例

import { setupComponents } from "@/components/index";  //全局组件引入
setupComponents(app);

import { setupRouter } from "@/router/index";  //路由
setupRouter(app);

import { setupStore } from "./store";  //vuex
setupStore(app);

import { setupI18n } from "@/language/index";  //i18n语言切换
setupI18n(app);

import "@/styles/index.less";  //引入公用样式

import "@/assets/icons/iconfont.css";  //iconfont

import "lib-flexible/flexible.js";  //移动端适配--lib-flexible

// vant
import vant from "vant"
import "vant/lib/index.css"
app.use(vant)

app.mount("#app");

拓展

【实现在request.js里引用store】
首先引入并暴露实例,然后再调用实例,其他模块如route等同理
https://www.cnblogs.com/huihuihero/p/17312127.html


【关于basic layout布局设置 】
项目layout页的布局,可实现content区域高度不足以撑开页面时,footer也在底部
https://www.cnblogs.com/huihuihero/p/17312176.html


【项目样式差异标准化处理】
https://www.cnblogs.com/huihuihero/p/17317828.html
posted @ 2022-09-14 08:38  huihuihero  阅读(3)  评论(0)    收藏  举报