国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

前端微服務(wù)無界實踐 | 京東云技術(shù)團隊

這篇具有很好參考價值的文章主要介紹了前端微服務(wù)無界實踐 | 京東云技術(shù)團隊。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、前言

隨著項目的發(fā)展,前端SPA應(yīng)用的規(guī)模不斷加大、業(yè)務(wù)代碼耦合、編譯慢,導(dǎo)致日常的維護難度日益增加。同時前端技術(shù)的發(fā)展迅猛,導(dǎo)致功能擴展吃力,重構(gòu)成本高,穩(wěn)定性低。因此前端微服務(wù)應(yīng)運而生。

前端微服務(wù)優(yōu)勢

1.復(fù)雜度可控: 業(yè)務(wù)模塊解耦,避免代碼過大,保持較低的復(fù)雜度,便于維護與開發(fā)效率。

2.獨立部署: 模塊部署,減少模塊影響范圍,單個模塊發(fā)生錯誤,不影響全局,提升項目穩(wěn)定性。

3.技術(shù)選型靈活: 在同一項目下可以使用市面上所有前端技術(shù)棧,也包括未來的前端技術(shù)棧。

4.擴展性,提升業(yè)務(wù)動態(tài)擴展的可能,避免資源浪費

微前端服務(wù)結(jié)構(gòu)

前端微服務(wù)無界實踐 | 京東云技術(shù)團隊

技術(shù)對比和選型:

選型 靜態(tài)資源預(yù)加載 子應(yīng)用?;?/th> iframe js沙箱 css沙箱 接入成本 地址
EMP × × × https://github.com/efoxTeam/emp
Qiankun × × 中低 https://qiankun.umijs.org/zh/
無界 中低 https://wujie-micro.github.io/doc/
micro-app × × 中低 https://zeroing.jd.com/micro-app/

通過對比多種技術(shù)對項目的支持情況和項目接入的成本,我們最終選型無界。

二、wujie簡單用法(以主應(yīng)用使用vue框架為例)

主應(yīng)用是vue框架可直接使用wujie-vue,react框架可直接使用wujie-react,先安裝對應(yīng)的插件哦

主應(yīng)用改造:

// 引入無界,根據(jù)框架不同版本不同,引入不同的版本
import { setupApp, bus, preloadApp, startApp } from 'wujie-vue2'

// 設(shè)置子應(yīng)用默認參數(shù)
setupApp({
    name: '子應(yīng)用id(唯一值)',
    url: "子應(yīng)用地址",
    exec: true,
    el: "容器",
    sync: true
})

// 預(yù)加載
preloadApp({ name: "唯一id"});

// 啟動子應(yīng)用
startApp({ name: "唯一id"});

子應(yīng)用改造:

1、跨域

子應(yīng)用如果支持跨域,則不用修改

原因:存在請求子應(yīng)用資源跨域

方案:因前端應(yīng)用基本是前后端分離,使用proxy代理。只需配置在子應(yīng)用配置允許跨域即可

// 本地配置
server: {
    host: '127.0.0.1', // 本地啟動如果主子應(yīng)用沒處在同一個ip下,也存在跨域的問題,需要配置
    headers: {
        'Access-Control-Allow-Credentials': true,
        'Access-Control-Allow-Origin': '*', // 如資源沒有攜帶 cookie,需設(shè)置此屬性
        'Access-Control-Allow-Headers': 'X-Requested-With,Content-Type',
        'Access-Control-Allow-Methods': '*'
    }
}

// nginx 配置
add_header Access-Control-Allow-Credentials true;
add_header Access-Control-Allow-Origin "*";
add_header Access-Control-Allow-Headers 'X-Requested-With,Content-Type';
add_header Access-Control-Allow-Methods "*";
2、運行模式選擇

無界有三種運行模式:單例模式、保活模式、重建模式

前端微服務(wù)無界實踐 | 京東云技術(shù)團隊

(1)、?;钅J剑ㄩL存頁面)

釋義:類似于vue的keep-alive性質(zhì)(子應(yīng)用實例和webcomponent不銷毀,狀態(tài)、路由都不丟失,只做熱webcomponent的熱插拔),子應(yīng)用不想做生命周期改造,子應(yīng)用切換又不想有白屏?xí)r間,可以采用保活模式。主應(yīng)用上有多個入口跳轉(zhuǎn)到子應(yīng)用的不同頁面,不能采用?;钅J?,因為無法改變子應(yīng)用路由。

配置:只需要在主應(yīng)用加載子應(yīng)用的時候,配置參數(shù)添加alive:true

效果:預(yù)加載+?;钅J?頁面數(shù)據(jù)請求和渲染提前完成,實現(xiàn)瞬間打開效果

(2)、單例模式

釋義:子應(yīng)用頁面切走,會調(diào)用window.__WUJIE_UNMOUNT銷毀子應(yīng)用當(dāng)前實例。子應(yīng)用頁面如果切換回來,會調(diào)用window.__WUJIE_MOUNT渲染子應(yīng)用新的子應(yīng)用實例。過程相當(dāng)于:銷毀當(dāng)前應(yīng)用實例 => 同步新路由 => 創(chuàng)建新應(yīng)用實例

配置:只需要在主應(yīng)用加載子應(yīng)用的時候,配置參數(shù)添加alive:false

改造生命周期

// window.__POWERED_BY_WUJIE__用來判斷子應(yīng)用是否在無界的環(huán)境中
if (window.__POWERED_BY_WUJIE__) {
  let instance;
  // 將子應(yīng)用的實例和路由進線創(chuàng)建和掛載
  window.__WUJIE_MOUNT = () => {
    const router = new VueRouter({ routes });
    instance = new Vue({ router, render: (h) => h(App) }).$mount("#app");
  };
   // 實例銷毀
  window.__WUJIE_UNMOUNT = () => {
    instance.$destroy();
  };
} else {
  // 子應(yīng)用單獨啟動
  new Vue({ router: new VueRouter({ routes }), render: (h) => h(App) }).$mount("#app");
}
 

(3)、重建模式

釋義:每次頁面切換銷毀子應(yīng)用webcomponent+js的iframe。

配置:只需要在主應(yīng)用加載子應(yīng)用的時候,配置參數(shù)添加alive:false

無生命周期改造

備注:非webpack打包的老項目,子應(yīng)用切換可能出現(xiàn)白屏,應(yīng)盡可能使用保活模式降低白屏?xí)r間

三、加載模塊(主應(yīng)用配置)

子應(yīng)用基礎(chǔ)信息管理

// subList.js 數(shù)據(jù)可在配置頁面動態(tài)配置
const subList = [
    {
        "name":"subVueApp1",
        "exec":true,// false只會預(yù)加載子應(yīng)用的資源,true時預(yù)執(zhí)行子應(yīng)用代碼
        "alive": true,
        "show":true,// 是否引入
        "url":{
            "pre":"http://xxx1-pre.com",
            "gray":"http://xxx1-gray.com",
            "prod":"http://xxx1.com"
        }
    },
    {
        "name":"subVueApp2",
        "exec":false,// false只會預(yù)加載子應(yīng)用的資源,true時預(yù)執(zhí)行子應(yīng)用代碼
        "alive": false,
        "show":true,// 是否引入
        "url":{
            "pre":"http://xxx2-pre.com",
            "gray":"http://xxx2-gray.com",
            "prod":"http://xxx2.com"
        }
    }
]
export default subList;
// hostMap.js
import subList from './subList'

 const env = process.env.mode || 'pre'

// 子應(yīng)用map結(jié)構(gòu)
const subMap = {}
const subArr = []

// 轉(zhuǎn)換子應(yīng)用
export const hostMap = () => {
    subList.forEach(v => {
        const {url, ...other} = v
        const info = {
            ...other,
            url: url[env]
        }
       subMap[v.name] = info
       subArr.push(info)
    })
   return subArr
}

// 獲取子應(yīng)用配置信息
export const getSubMap = name => {
    return subMap[name].show ? subMap[name] : {}
}

子應(yīng)用注冊預(yù)加載和啟動

// setupApp.js
import WujieVue from 'wujie-vue2';
import {hostMap} from './hostMap';

const { setupApp, preloadApp } = WujieVue 

const setUpApp = Vue => {
    Vue.use(WujieVue)
    hostMap().forEach(v => {
        setupApp(v)
        preloadApp(v.name)
    })
}
export default setUpApp;


// main.js
import Vue from 'vue'
import setUpApp from'@/microConfig/setupApp'
setUpApp(Vue)

配置公共函數(shù)

全子應(yīng)用共享的生命周期函數(shù),可用于執(zhí)行多個子應(yīng)用間相同的邏輯操作函數(shù)共同處理

// lifecycle.js
const lifecycles = {
  beforeLoad: (appWindow) => console.log(`${appWindow.__WUJIE.id} beforeLoad 生命周期`),
  beforeMount: (appWindow) => console.log(`${appWindow.__WUJIE.id} beforeMount 生命周期`),
  afterMount: (appWindow) => console.log(`${appWindow.__WUJIE.id} afterMount 生命周期`),
  beforeUnmount: (appWindow) => console.log(`${appWindow.__WUJIE.id} beforeUnmount 生命周期`),
  afterUnmount: (appWindow) => console.log(`${appWindow.__WUJIE.id} afterUnmount 生命周期`),
  activated: (appWindow) => console.log(`${appWindow.__WUJIE.id} activated 生命周期`),
  deactivated: (appWindow) => console.log(`${appWindow.__WUJIE.id} deactivated 生命周期`),
  loadError: (url, e) => console.log(`${url} 加載失敗`, e),
};

export default lifecycles;


// subCommon.js
// 跳轉(zhuǎn)到主應(yīng)用指定頁面
const toJumpMasterApp = (location, query) => {
    
    this.$router.replace(location, query);
    const url = new URL(window.location.href);
    url.search = query
    // 手動的掛載url查詢參數(shù)
    window.history.replaceState(null, '', url.href);
}
// 跳轉(zhuǎn)到子應(yīng)用的頁面
const toJumpSubApp = (appName, query) => {
   this.$router.push({path: appName}, query)
}
export default {
    toJumpMasterApp,
    toJumpSubApp 
}


// setupApp.js
import lifecycles from './lifecycles';
import subCommon from './subCommon';
const setUpApp = Vue => {
    ....
    hostMap().forEach(v => {
        setupApp({
            ...v,
            ...lifecycles,
            props: subCommon
        })
        preloadApp(v.name)
    })
}

主應(yīng)用加載子應(yīng)用頁面

// 子應(yīng)用頁面加載
// app1.vue
<template>
    <WujieVue
        :key="update"
        width="100%"
        height="100%"
        :name="name"
        :url="appUrl"
        :sync="subVueApp1Info.sync" 
        :alive="subVueApp1Info.alive" 
        :props="{ data: dataProps ,method:{propsMethod}}"
    ></WujieVue>
</template>

<script>
import wujieVue from "wujie-vue2";
import {getSubMap} from '../../hostMap';
const name = 'subVueApp1'
export default {
    data() {
       return {
          dataProps: [],
          subVueApp1Info: getSubMap(name)
       }
    },
    computed: {
      appUrl() {
        // return getSubMap('subVueApp1').url
        return this.subVueApp1Info.url + this.$route.params.path
      }
    },
     watch: {
        // 如果子應(yīng)用是?;钅J剑梢圆捎猛ㄐ诺姆绞礁嬷酚勺兓?        "$route.params.path": {
          handler: function () {
            wujieVue.bus.$emit("vue-router-change", `/${this.$route.params.path}`);
          },
          immediate: true,
        },
      },
    methods: {
        propsMethod() {}
    }
}
</script>

四、子應(yīng)用配置

無界的插件體系主要是方便用戶在運行時去修改子應(yīng)用代碼從而避免去改動倉庫代碼

前端微服務(wù)無界實踐 | 京東云技術(shù)團隊

// plugins.js
const plugins = {
  'subVueApp1': [{
    htmlLoader:code => {
      return code;
    },
    cssAfterLoaders: [
      // 在加載html所有樣式之后添加一個外聯(lián)樣式
      { src:'https://xxx/xxx.css' },
      // 在加載html所有樣式之后添加一個內(nèi)聯(lián)樣式
      { content:'img{height: 300px}' }
    ],
    jsAfterLoaders: [
      { src:'http://xxx/xxx.js' },
      // 插入一個內(nèi)聯(lián)腳本本
      { content:`
          window.$wujie.bus.$on('routeChange', path => {
          console.log(path, window, self, global, location)
          })`
      },
      // 執(zhí)行一個回調(diào)
      {
        callback(appWindow) {
          console.log(appWindow.__WUJIE.id);
        }
      }
    ]
  }],
  'subVueApp2': [{
    htmlLoader: code=> {
      return code;
    }
  }]
};
export default plugins;
// setupApp.js
import plugins from './plugins';
const setUpApp = Vue => {
    ......
    hostMap().forEach(v => {
        setupApp({
            ...v,
            plugins: plugins[element.name]
        })
        ......
    })
}

五、數(shù)據(jù)傳輸和消息通信

數(shù)據(jù)交互方式

1,通過props進行傳

2、通過window進線傳達

3,通過事件bus進行傳達

props

主應(yīng)用通過data傳參給子應(yīng)用, 子應(yīng)用通過methods方法傳參給主應(yīng)用

// 主應(yīng)用
<WujieVue name="xxx" url="xxx" :props="{ data: xxx, methods: xxx }"></WujieVue>

// 子應(yīng)用
const props = window.$wujie?.props; // {data: xxx, methods: xxx}
window

利用子應(yīng)用運行在主應(yīng)用的iframe

類似iframe的傳參和調(diào)用

// 主應(yīng)用獲取子應(yīng)用的全局變量數(shù)據(jù)
window.document.querySelector("iframe[name=子應(yīng)用id]").contentWindow.xxx;

//子應(yīng)用獲取主應(yīng)用的全局變量數(shù)據(jù)
window.parent.xxx;
eventBus

去中心化的通信方案,方便。類似于組件間的通信

主應(yīng)用

// 使用 wujie-vue
import WujieVue from"wujie-vue";
const{ bus }= WujieVue;

// 主應(yīng)用監(jiān)聽事件
bus.$on("事件名字",function(arg1,arg2, ...){});
// 主應(yīng)用發(fā)送事件
bus.$emit("事件名字", arg1, arg2,...);
// 主應(yīng)用取消事件監(jiān)聽
bus.$off("事件名字",function(arg1,arg2, ...){});

子應(yīng)用

// 子應(yīng)用監(jiān)聽事件
window.$wujie?.bus.$on("事件名字",function(arg1,arg2, ...){});
// 子應(yīng)用發(fā)送事件
window.$wujie?.bus.$emit("事件名字", arg1, arg2,...);
// 子應(yīng)用取消事件監(jiān)聽
window.$wujie?.bus.$off("事件名字",function(arg1,arg2, ...){});

規(guī)范主子應(yīng)用傳遞規(guī)則

規(guī)則:子應(yīng)用名+事件名

主應(yīng)用向子應(yīng)用傳參

// 主應(yīng)用傳參
bus.$emit('matser', options) // 主應(yīng)用向所有子應(yīng)用傳參
bus.$emit('vite:getOptions', options) // 主應(yīng)用向指定子應(yīng)用傳參

//子應(yīng)用監(jiān)聽主應(yīng)用事件
window?.$wujie?.bus.$on("master", (options) => {
  console.log(options)
});
//子應(yīng)用監(jiān)聽主應(yīng)用特定通知子應(yīng)用事件
window?.$wujie?.bus.$on("vite:getOptions", (options) => {
  console.log(options)
});

六、路由

以 vue 主應(yīng)用為例,子應(yīng)用 A 的 name 為 A, 主應(yīng)用 A 頁面的路徑為/pathA,子應(yīng)用 B 的 name 為 B,主應(yīng)用 B 頁面的路徑為/pathB為例

主應(yīng)用統(tǒng)一props傳入跳轉(zhuǎn)函數(shù)

jump (location) {
  this.$router.push(location);
}

1、主應(yīng)用history路由

子應(yīng)用 B 為非?;顟?yīng)用

1、子應(yīng)用A 只能跳轉(zhuǎn)到子應(yīng)用 B 的主應(yīng)用的默認路由

function handleJump(){
   window.$wujie?.props.jump({ path:"/pathB"});
}

2、子應(yīng)用A 只能跳轉(zhuǎn)到子應(yīng)用B 應(yīng)用的指定路由(非默認路由)

// 子應(yīng)用A點擊跳轉(zhuǎn)處理函數(shù), 子應(yīng)用B需開啟路由同步
function handleJump(){
    window.$wujie?.props.jump({ path:"/pathB", query:{ B:"/test"}});
}
子應(yīng)用 B 為?;顟?yīng)用

子應(yīng)用A 只能跳轉(zhuǎn)到子應(yīng)用 B 的主應(yīng)用的路由

可寫入主應(yīng)用的插件中,主應(yīng)用插件根據(jù)不同的應(yīng)用,引入不同方法

// 子應(yīng)用 A 點擊跳轉(zhuǎn)處理函數(shù)
function handleJump() {
  window.$wujie?.bus.$emit("routeChange", "/test");
}

// 子應(yīng)用 B 監(jiān)聽并跳轉(zhuǎn)
window.$wujie?.bus.$on("routeChange", (path) => this.$router.push({ path }));

2、主應(yīng)用hash路由

子應(yīng)用 B 為非?;顟?yīng)用

1、子應(yīng)用A 只能跳轉(zhuǎn)到子應(yīng)用 B 的主應(yīng)用的默認路由

同子應(yīng)用B為非?;顟?yīng)用,子應(yīng)用A跳轉(zhuǎn)到子應(yīng)用 B 的主應(yīng)用的默認路由

2、子應(yīng)用A 只能跳轉(zhuǎn)到子應(yīng)用B 應(yīng)用的指定路由(非默認路由)

主應(yīng)用
jump(location,query){ 
    // 跳轉(zhuǎn)到主應(yīng)用B頁面
    this.$router.push(location); 
    const url=new URL(window.location.href);
    url.search=query
    // 手動的掛載url查詢參數(shù)
    window.history.replaceState(null,"",url.href);
}

// 子應(yīng)用 B 開啟路由同步能力


// 子應(yīng)用A
function handleJump() {
  window.$wujie?.props.jump({ path: "/pathB" } , `?B=${window.encodeURIComponent("/test")}`});
}
子應(yīng)用 B 為保活應(yīng)用

同子應(yīng)用B為?;顟?yīng)用,子應(yīng)用A跳轉(zhuǎn)到子應(yīng)用 B 路由

// bus.js
// 在 xxx-sub 路由下子應(yīng)用將激活路由同步給主應(yīng)用,主應(yīng)用跳轉(zhuǎn)對應(yīng)路由高亮菜單欄
  bus.$on('sub-route-change', (name, path) => {
      const mainName = `${name}-sub`;
      const mainPath = `/${name}-sub${path}`;
      const currentName = router.currentRoute.name;
      const currentPath = router.currentRoute.path;
    if (mainName === currentName && mainPath !== currentPath) {
        router.push({ path: mainPath });
      }
  });

七、部署

前端單頁面的部署,不管怎么自動化,工具怎么變. 都是把打包好的靜態(tài)文件,放到服務(wù)器的正確位置下。所以支持項目的獨立部署和混合部署。

作者:京東物流 張燕燕 劉海鼎

內(nèi)容來源:京東云開發(fā)者社區(qū)文章來源地址http://www.zghlxwxcb.cn/news/detail-463004.html

到了這里,關(guān)于前端微服務(wù)無界實踐 | 京東云技術(shù)團隊的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 助力618-Y的混沌實踐之路 | 京東云技術(shù)團隊

    助力618-Y的混沌實踐之路 | 京東云技術(shù)團隊

    1、混沌是什么? 混沌工程(Chaos Engineering)的概念由 Netflix 在 2010 年提出,通過主動向系統(tǒng)中引入異常狀態(tài),并根據(jù)系統(tǒng)在各種壓力下的行為表現(xiàn)確定優(yōu)化策略,是保障系統(tǒng)穩(wěn)定性的新型手段。 混沌工程是一門在分布式系統(tǒng)上進行實驗的學(xué)科,目的是建立人們對于復(fù)雜系統(tǒng)

    2024年02月14日
    瀏覽(25)
  • Flutter狀態(tài)管理新的實踐 | 京東云技術(shù)團隊

    Flutter狀態(tài)管理新的實踐 | 京東云技術(shù)團隊

    1.1 聲明式ui 聲明式UI其實并不是近幾年的新技術(shù),但是近幾年聲明式UI框架非常的火熱。單說移動端,跨平臺方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose??梢钥吹铰暶魇経I是以后的前端發(fā)展趨勢。而狀態(tài)管理是聲明式UI框架的重要組成部分。 1.2 聲明式UI框架的

    2024年02月10日
    瀏覽(55)
  • 618技術(shù)揭秘:探究競速榜頁面核心前端技術(shù) | 京東云技術(shù)團隊

    618技術(shù)揭秘:探究競速榜頁面核心前端技術(shù) | 京東云技術(shù)團隊

    H5頁面作為移動端Web應(yīng)用的重要形式之一,已經(jīng)成為了現(xiàn)代Web開發(fā)的熱門話題。在H5頁面的開發(fā)過程中,前端技術(shù)的應(yīng)用至關(guān)重要。本文將探究京東競速榜H5頁面的核心前端技術(shù),包括動畫、樣式配置化、皮膚切換、海報技術(shù)、調(diào)試技巧等方面,希望能夠為廣大前端開發(fā)者提供

    2024年02月12日
    瀏覽(21)
  • 京東門詳一碼多端探索與實踐 | 京東云技術(shù)團隊

    京東門詳一碼多端探索與實踐 | 京東云技術(shù)團隊

    本文主要講述京東門詳業(yè)務(wù)在支撐過程中遇到的困境,面對問題我們在效率提升、質(zhì)量保障等方向的探索和實踐,在此將實踐過程中問題解決的思路和方案與大家一起分享,也希望能給大家?guī)硪恍┬碌膯l(fā) 1.1.1、京東門詳業(yè)務(wù) 門店詳情頁簡稱門詳,門詳業(yè)務(wù)包含門店詳情、

    2024年02月12日
    瀏覽(33)
  • 關(guān)于并發(fā)編程與線程安全的思考與實踐 | 京東云技術(shù)團隊

    關(guān)于并發(fā)編程與線程安全的思考與實踐 | 京東云技術(shù)團隊

    作者:京東健康 張娜 并發(fā)編程的意義是充分的利用處理器的每一個核,以達到最高的處理性能,可以讓程序運行的更快。而處理器也為了提高計算速率,作出了一系列優(yōu)化,比如: 1、硬件升級:為平衡CPU 內(nèi)高速存儲器和內(nèi)存之間數(shù)量級的速率差,提升整體性能,引入了多

    2024年02月07日
    瀏覽(25)
  • 前端微服務(wù)無界實踐

    前端微服務(wù)無界實踐

    隨著項目的發(fā)展,前端SPA應(yīng)用的規(guī)模不斷加大、業(yè)務(wù)代碼耦合、編譯慢,導(dǎo)致日常的維護難度日益增加。同時前端技術(shù)的發(fā)展迅猛,導(dǎo)致功能擴展吃力,重構(gòu)成本高,穩(wěn)定性低。因此前端微服務(wù)應(yīng)運而生。 1.復(fù)雜度可控: 業(yè)務(wù)模塊解耦,避免代碼過大,保持較低的復(fù)雜度,便于維

    2024年02月06日
    瀏覽(16)
  • 【OpenAI】ChatGPT函數(shù)調(diào)用(Function Calling)實踐 | 京東云技術(shù)團隊

    6月13日OpenAI在Chat Completions API中添加了新的函數(shù)調(diào)用(Function Calling)能力,幫助開發(fā)者通過API方式實現(xiàn)類似于ChatGPT插件的數(shù)據(jù)交互能力。 本文在作者上一篇文章《私有框架代碼生成實踐》的基礎(chǔ)上,依舊使用自然語言低代碼搭建場景作為案例,將嵌入向量搜索(Embedding)獲

    2024年02月12日
    瀏覽(18)
  • 架構(gòu)師日記-聊聊開發(fā)必掌握的那些實踐技能 | 京東云技術(shù)團隊

    盡管軟件開發(fā)一直致力于追求高效、可讀性強、易于維護的特性,但這些特性卻像是一個不可能三角,相互交織,此消彼長。就像底層語言(如匯編和C語言)能夠保持高效的運行性能,但在可讀性和維護性方面卻存在短板和劣勢;而高級語言(如Java和Python)在可讀性和可維

    2024年02月08日
    瀏覽(25)
  • 前端文件上傳的幾種交互造輪子 | 京東云技術(shù)團隊

    前端文件上傳本來是一個常規(guī)交互操作,沒什么特殊性可言,但是最近在做文件上傳,需要實現(xiàn)截圖粘貼上傳,去找了下有沒有什么好用的組件,網(wǎng)上提供的方法有,但是沒找完整的組件來支持cv上傳,經(jīng)過了解發(fā)現(xiàn)可以用剪貼板功能讓自己的cv實現(xiàn)文件上傳,于是自己就整合

    2024年02月11日
    瀏覽(20)
  • CRM系統(tǒng)化整合從N-1做減法實踐 | 京東物流技術(shù)團隊

    CRM系統(tǒng)化整合從N-1做減法實踐 | 京東物流技術(shù)團隊

    京銷易系統(tǒng)已經(jīng)接入大網(wǎng)、KA以及云倉三個條線商機,每個條線商機規(guī)則差異比較大,當(dāng)前現(xiàn)狀是獨立實現(xiàn)三套系統(tǒng)分別做支撐。 2022年下半年CRM目標(biāo)是完成9個新條線業(yè)務(wù)接入,完成銷售過程線上化,實現(xiàn)銷售規(guī)則統(tǒng)一。 前端實現(xiàn)數(shù)據(jù)存儲與邏輯代碼耦合一起,無法復(fù)用,無

    2024年02月15日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包