2025年2月26日 星期三

requireJs 中使用 Vue3 框架


 參考 requireJs中使用Vue3及Vue3框架(viewUIPlus、elementPlus)

目录结构


HTML页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>hello</title>
    <script src="js/lib/require.js" data-main="js/script/main"></script>
</head>
<body>

main 配置文件

require.config({
    // 加載 js 的目錄,paths 中以此目錄為標準讀取
    baseUrl: 'js',

    // 類庫别名和路徑配置
    paths: {
        jquery: 'lib/jquery-3.7.1',
        // vue 别名必须為 vue,由於其他框架或模块寻找 vue 时查询的是 vue 的别名
        vue: 'lib/vue3/vue.global.prod',
        // viewUIPlus框架
        viewUIPlus: 'lib/viewUiPlus/viewuiplus.min',
        // elementPlus 框架
        elementPlus: 'lib/elementPlus/index.full.min',
        // elementPlus 字体库
        elementPlusIconsVue: 'lib/elementPlus/icons-vue/dist/index.iife.min',
    },

    // 依赖以及导出设置,key值需对应paths中的别名,用于非AMD标准的类库进行导出
    shim: {
        // 由于vue3不是标准的AMD模块,需要手动抛出Vue变量,供其他框架使用
        'vue': {
            exports: 'Vue'
        },
        // viewUIPlus css
        'viewUIPlus': ['vue', 'css!lib/viewUiPlus/styles/viewuiplus.css'],
        // elementPlus 字体库依赖vue 没有这个配置,加载字体库时可能因为vue还未加载而报错
        'elementPlusIconsVue': {
            // 依赖
            deps: ['vue'],
            // 导出变量
            exports: 'ElementPlusIconsVue',
        },
        // elementPlus css 字體庫
        'elementPlus': ['vue', 'css!lib/elementPlus/index.css', 'elementPlusIconsVue',],
    },

    // 插件以及其他模塊配置
    map: {
        '*': {
            // 加載 css 插件
            'css': 'lib/require-css'
        },
    },
});

// 單獨使用 vue
require(['vue'], function (Vue) {
    const {createApp} = Vue
    const app = createApp({
        data() {
            return {
                message: 'Hello Vue!',
            }
        },
        methods: {}
    })
    app.mount("#app");
})

// viewUIPlus vue依赖已在shim中配置,无需再次引入
require(['viewUIPlus'], function (ViewUIPlus) {
    const {createApp} = Vue
    const app = createApp({
        data() {
            return {
                message: 'Hello viewUiPlus!',
            }
        },
        methods: {}
    })
    app.use(ViewUIPlus);
    app.mount("#viewUi");
})

// elementPlus 字体库和vue依赖已在shim中配置,无需再次引入
require(['elementPlus'], function (ElementPlus) {
    const {createApp} = Vue
    const app = createApp({
        data() {
            return {
                message: 'Hello elementPlus'
            }
        },
        methods: {}
    })
    // 字体库组件
    for ([name, comp] of Object.entries(ElementPlusIconsVue)) {
        app.component(name, comp);
    }
    app.use(ElementPlus);
    app.mount("#ele");
})

效果

Vue2 及 Vue3 同時存在

require.config({
  baseUrl: ntuweb.baseUrl+'/assets',
  paths: {
    "jquery": "jquery-1.12.4.min",
    "jqueryform": "jquery.form.4.2.2.min",
    "jqueryui": "jquery-ui/jquery-ui-1.10.4.custom.min",
    "vue": "vue_2.6.14",  
    'vue3': "vue.global-3.5.12.min",
    "showModalDialog": "showModalDialog",
    'corejs': 'corejs-2.6.12_shim.min'
    , 'swal': 'sweetalert2-10.min'
  },
  // 以下為非 AMD 程式,有固定的載入順序
  shim : {
    // 由於 vue3 不是準的 AMD 模塊,需要手動拋出 Vue 變量,用於非AMD標準類庫進行導出
    'vue3': {
      exports: 'Vue'
    },
    "jqueryui": ["jquery"],
    "jqueryform": ["jquery"]
    , 'swal': ['corejs']
    , "showModalDialog": ["jqueryui"]
    , 'wbSingle': ['swal']
  }
});

使用 Vue2

require(['jquery', 'vue', 'showModalDialog', 'jqueryform'], function($, Vue)
{
    vm = new Vue({
        el: '#main-div',
        data: {
            dat: <?= json_encode($gdat) ?>,
            frm_label: '',
            LbState: 0, 
        },
        computed: {
            .....
        },
        methods: {
            .....
        }
    });
});

使用 Vue3

rrequire(['jquery', 'vue3', 'showModalDialog', 'jqueryform'], function($, Vue)
{
    const { createApp, ref ,reactive, computed} = Vue;

    vm = createApp({
        setup() {
            const dat = reactive({
                cou_code: ref(''),
                cou_cname: ref(''),
                credit: ref(0),
		..........
            });

            const frm_label = ref('');
            const LbState = ref(0); 

            return {
                dat, frm_label, LbState,
            }
        },
        computed: {
            ..........
        },
        methods: {
            ...........
        }
    }).mount('#main-div');
});

更新物件 dat 的屬性的值

Object.keys(vm.dat).forEach(function (kk) {
    vm.dat[kk] = ret[kk];
});











沒有留言:

張貼留言

網誌存檔