最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 从零搭建Vite2+Vue+Antd项目

    正文概述 掘金(蓝色夜晚)   2021-03-22   1442

    Vite是什么

    Vite2.0 的发布带来了对低版本浏览器的构建支持,使其可以正式投入项目生产。

    初始化项目

    # npm 6.x
    npm init @vitejs/app my-vue-app --template vue-ts
    
    # npm 7+, 需要额外的双横线:
    npm init @vitejs/app my-vue-app -- --template vue-ts
    

    本人选择了 Vue3 + TypeScript 的模板初始化(更多模板),模板载入完成后,按提示进入项目目录、载入依赖并尝试运行项目。 从零搭建Vite2+Vue+Antd项目

    less-CSS预处理器

    npm i less -D
    

    vue-router

    1. 载入vue-router4.x
    npm i vue-router@4
    
    1. 在 src 目录下新建 router/index.ts ,写入路由配置。
    import {createRouter, createWebHashHistory, RouteRecordRaw} from 'vue-router';
    import Home from '../views/Home.vue';
    
    const routes: Array<RouteRecordRaw> = [ // 加入类型声明可以约束配置项,提升书写体验
        {
            path: '/',
            name: 'Home',
            component: Home,
        }
    ];
    
    const router = createRouter({
        history: createWebHashHistory(),
        routes,
    });
    
    export default router;
    
    1. 在 main.ts 中引入路由配置
    import {createApp} from 'vue';
    import router from './router'; // <---
    import App from './App.vue';
    
    createApp(App)
        .use(router) // <---
        .mount('#app');
    
    1. 在 src 目录下新建 views/Home.vue ,写入首页想要呈现的内容。
    <template>
      <img  src="../assets/logo.png" />
      <p>Home: Hello Vue 3 + TypeScript + Vite</p>
    </template>
    
    <script lang="ts">
    import {defineComponent} from 'vue';
    
    export default defineComponent({
      name: 'Home'
    })
    </script>
    
    1. App.vue 此时可以作为 reouter-view 的载体,例如修改为以下内容。
    <template>
        <div id="nav">
            <router-link to="/">Home</router-link>
        </div>
        <router-view/>
    </template>
    
    <style lang="less">
    #app {
      text-align: center;
      color: #2c3e50;
    }
    
    #nav {
      padding: 30px;
    
      a {
        font-weight: bold;
        color: #2c3e50;
    
        &.router-link-exact-active {
          color: #42b983;
        }
      }
    }
    </style>
    
    1. 运行项目,Home 页已经呈现出来。

    从零搭建Vite2+Vue+Antd项目

    vuex

    1. 载入vuex4.x
    npm i vuex@4
    
    1. 在 src 目录下新建 store/index.ts ,写入状态管理器配置。
    import {InjectionKey} from 'vue';
    import {createStore, Store} from 'vuex';
    import user, {State as UserState} from './user';
    
    // 将各模块的State类型汇总
    export interface State {
        user: UserState;
    }
    
    export const key: InjectionKey<Store<State>> = Symbol();
    
    const debug = process.env.NODE_ENV !== 'production';
    
    export const store = createStore<State>({
        modules: {user},
        strict: debug
    });
    // 向组件注入$store的类型声明
    declare module '@vue/runtime-core' {
        interface ComponentCustomProperties {
            $store: Store<State>;
        }
    }
    
    1. 模块化,新建store/user.ts实现user模块。
    import {Module} from 'vuex';
    import {State as RootState} from './index';
    
    export interface State {
        age: number;
    }
    export default {
        namespaced: true,
        actions: {
            addAge({commit, state}, value: number) {
                commit('SET_USER_AGE', state.age + value);
            }
        },
        getters: {
            age: state => state.age
        },
        mutations: {
            SET_USER_AGE(state, age: State['age']) {
                state.age = age;
            }
        },
        state: {
            age: 5
        }
    } as Module<State, RootState>;
    
    1. 在main.ts 中引入 store。
    import {createApp} from 'vue';
    import router from './router';
    import {store, key} from './store'; // <---
    import App from './App.vue';
    
    createApp(App)
        .use(store, key) // <---
        .use(router)
        .mount('#app')
    
    1. 在 Home.vue 中调用 user 模块的状态,再次运行项目。
    <template>
        <!-- .... -->
        <p>
            <span>vuex user/age: {{age}}</span>
            <button @click="addAge">age++</button>
        </p>
    </template>
    <script lang="ts">
    import {defineComponent, computed} from 'vue';
    import {useStore} from 'vuex';
    import {key} from '../store';
    
    export default defineComponent({
      name: 'Home',
      setup() {
        const store = useStore(key); // 调用 vuex 的 Composition API 获取 store ,相当于 $store
        const age = computed(() => store.getters['user/age']);
        const addAge = () => store.dispatch('user/addAge', 1);
        return {age,addAge};
      }
    })
    </script>
    

    从零搭建Vite2+Vue+Antd项目

    ant-design-vue

    1. 载入 ant-design-vue2.x
    npm i ant-design-vue@next
    
    # 处理按需加载的插件
    npm i vite-plugin-importer -D
    
    1. 在 vite.config.ts 加入 vite-plugin-importer
    import {defineConfig} from 'vite';
    import vue from '@vitejs/plugin-vue';
    import importerPlugin from 'vite-plugin-importer'; // <---
    
    // https://vitejs.dev/config/
    export default defineConfig({
        css: {
            preprocessorOptions: {
                less: {
                    javascriptEnabled: true // 使用 antd 的 less 样式 需要开启
                }
            },
        },
        plugins: [
            vue(),
            importerPlugin({ // <---
                libraryName: "ant-design-vue",
                libraryDirectory: "es",
                style: true // less
            })
        ]
    });
    
    1. 在 src 目录下新建 config/antd.config.ts 全局引入 antd 组件。
    import {Plugin} from 'vue';
    import {Button, message} from 'ant-design-vue';
    
    const antdInstall: Plugin = function (app) { // 声明为中间件暴露,调用时更优雅
        app.use(Button);
        app.config.globalProperties.$message = message;
    };
    export default antdInstall;
    declare module '@vue/runtime-core' {
        interface ComponentCustomProperties {
            $message: typeof message;
        }
    }
    
    1. 在 main.ts 引入 antd 的配置。
    import {createApp} from 'vue';
    import antd from './config/antd.config'; // <---
    import router from './router';
    import {store, key} from './store';
    import App from './App.vue';
    
    createApp(App)
        .use(store, key)
        .use(router)
        .use(antd) // <---
        .mount('#app')
    
    1. 在 Home.vue 使用 antd 的 button 组件,再次运行项目。
    <template>
        <!-- .... -->
        <a-button type="primary" @click="addAge">age++</a-button>
        <!-- .... -->
    </template>
    
    

    从零搭建Vite2+Vue+Antd项目

    低版本浏览器兼容

    1. 载入 @vitejs/plugin-legacy
    npm i @vitejs/plugin-legacy -D
    
    1. 在 vite.config.ts 中启用 @vitejs/plugin-legacy
    import {defineConfig} from 'vite';
    // ...
    import legacyPlugin from '@vitejs/plugin-legacy';
    
    // https://vitejs.dev/config/
    export default defineConfig({
        // ...
        plugins: [
            // ...
            legacyPlugin({
                targets: ['defaults', 'not IE 11']
            })
        ]
    });
    

    如此构建时,vite 将按 targets 配置编译产物。

    国际化

    1. 载入vue-i18n
    npm i vue-i18n@next
    
    1. 在 src 目录下新建 config/i18n.config.ts,配置多语言文案。
    import {createI18n} from 'vue-i18n';
    
    const messages = {
        cn: {
            message: {
                hello: '你好,中国'
            }
        },
        en: {
            message: {
                hello: 'Hello World'
            }
        }
    };
    
    export default createI18n({
        locale: 'en',
        fallbackLocale: 'en',
        messages
    });
    
    1. 在 main.ts 中引入国际化配置。
    import {createApp} from 'vue';
    // ...
    import i18n from 'config/i18n.config';
    import App from './App.vue';
    
    createApp(App)
        .use(i18n)
        // ...
        .mount('#app');
    
    1. 在 Home.vue 调用语言输出函数,再次运行项目。
    <template>
        <!-- ... -->
        <p>{{$t('message.hello')}}</p>
        <p>{{t('message.hello')}}</p>
    </template>
    <script lang="ts">
    import {defineComponent} from 'vue';
    import {useI18n} from 'vue-i18n';
    
    export default defineComponent({
      name: 'Home',
      setup() {
        // ...
        return {
            // ...
            t: useI18n().t
        };
      }
    })
    </script>
    

    使用已全局注入的 $t 和 useI18n().t 都可以,useI18n负责在setup中获取文案输出。

    从零搭建Vite2+Vue+Antd项目

    别名

    1. 在 vite.config.ts 配置vue文件中对别名的映射。
    import {defineConfig} from 'vite';
    // ...
    
    // https://vitejs.dev/config/
    export default defineConfig({
        // ...
        resolve: {
            alias: {
                '@': '/src',
                'assets': '/src/assets',
                'components': '/src/components',
                'config': '/src/config',
                'router': '/src/router',
                'store': '/src/store',
                'views': '/src/views'
            }
        }
    });
    
    1. 在 ts.config.json 中配置ts文件中对别名的映射。
    {
        "compilerOptions": {
            // ...
            "paths": {
              "@/*": ["src/*"],
              "*": ["*", "src/*"]
            },
            // ...
        }
      }
    

    总结

    • 每个依赖官网都有指南和详细的文档,按步骤即可完成搭建。
    • 大部分依赖都有了typescript 的实现,配置时,使用依赖中提供的类型约束将带来良好的提示和检查。
    • vite 使用 rollup 实现,扩展时可使用 rollup 插件。
    • 还未找到 vite 如何结合 lint 工具。

    起源地下载网 » 从零搭建Vite2+Vue+Antd项目

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元