diff --git a/.obsidian/community-plugins.json b/.obsidian/community-plugins.json index 8b2c7bf..a42302d 100644 --- a/.obsidian/community-plugins.json +++ b/.obsidian/community-plugins.json @@ -6,7 +6,6 @@ "recent-files-obsidian", "oz-clear-unused-images", "obsidian-excalidraw-plugin", - "copy-url-in-preview", "templater-obsidian", "obsidian-linter" ] \ No newline at end of file diff --git a/.obsidian/plugins/copy-url-in-preview/data.json b/.obsidian/plugins/copy-url-in-preview/data.json deleted file mode 100644 index 2a677ce..0000000 --- a/.obsidian/plugins/copy-url-in-preview/data.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "middleClickNewTab": false, - "revealInNavigation": true, - "enableDefaultOnCanvas": false, - "pdfMenu": false -} \ No newline at end of file diff --git a/.obsidian/plugins/copy-url-in-preview/main.js b/.obsidian/plugins/copy-url-in-preview/main.js deleted file mode 100644 index 4d2892c..0000000 --- a/.obsidian/plugins/copy-url-in-preview/main.js +++ /dev/null @@ -1,9 +0,0 @@ -/* -THIS IS A GENERATED/BUNDLED FILE BY ESBUILD -if you want to view the source, please visit the github repository of this plugin -*/ - -"use strict";var g=Object.defineProperty;var R=Object.getOwnPropertyDescriptor;var _=Object.getOwnPropertyNames;var W=Object.prototype.hasOwnProperty;var $=(t,i,e)=>i in t?g(t,i,{enumerable:!0,configurable:!0,writable:!0,value:e}):t[i]=e;var j=(t,i)=>{for(var e in i)g(t,e,{get:i[e],enumerable:!0})},G=(t,i,e,n)=>{if(i&&typeof i=="object"||typeof i=="function")for(let o of _(i))!W.call(t,o)&&o!==e&&g(t,o,{get:()=>i[o],enumerable:!(n=R(i,o))||n.enumerable});return t};var H=t=>G(g({},"__esModule",{value:!0}),t);var d=(t,i,e)=>$(t,typeof i!="symbol"?i+"":i,e);var V={};j(V,{default:()=>w});module.exports=H(V);var p=require("obsidian");var m=require("obsidian");var S={middleClickNewTab:!0,revealInNavigation:!0,enableDefaultOnCanvas:!1},f=class extends m.PluginSettingTab{constructor(e,n){super(e,n);d(this,"plugin");this.plugin=n}display(){let{containerEl:e}=this;e.empty(),e.createEl("h3",{text:"Image Context Menus settings"}),new m.Setting(e).setName("Middle mouse click on image link to open in new tab").addToggle(n=>{n.setValue(this.plugin.settings.middleClickNewTab).onChange(o=>{this.plugin.settings.middleClickNewTab=o,this.plugin.saveSettings()})}),new m.Setting(e).setName("Reveal file in navigation menu item").setDesc("You might want to disable this if you use a plugin for replacing default Obsidian file navigation. This plugin supports File Tree Alternative by displaying a reveal menu item for it if installed.").addToggle(n=>{n.setValue(this.plugin.settings.revealInNavigation).onChange(o=>{this.plugin.settings.revealInNavigation=o,this.plugin.saveSettings()})}),new m.Setting(e).setName("Enable regular context menu on canvas").setDesc(`The regular context menu sometimes duplicates the context menu on the canvas, so it's disabled there by default. -There is a separate context menu for images directly on the canvas, but if that's not enough (for example for images in notes on canvas), you can enable the regular context menu here too.`).addToggle(n=>{n.setValue(this.plugin.settings.enableDefaultOnCanvas).onChange(o=>{this.plugin.settings.enableDefaultOnCanvas=o,this.plugin.saveSettings()})})}};function y(t){return t=new URL(t),t.search="",t.toString()}function b(t,i){let e=new Promise(n=>setTimeout(()=>{n(null)},t));return Promise.race([i,e])}function I(t,i,e,n,o){return t.on(i,e,n,o),()=>{t.off(i,e,n,o)}}var C=require("obsidian");var F=require("obsidian");var T=5e3;async function D(t){try{if(t.type!=="image/svg+xml")return await navigator.clipboard.write([new ClipboardItem({[t.type]:t})]),!0}catch(i){console.warn("Failed copying image with original mimetype, using PNG fallback - ",i)}try{return t=new Blob([t],{type:"image/png"}),await navigator.clipboard.write([new ClipboardItem({[t.type]:t})]),!0}catch(i){console.warn("Failed copying image with PNG mimetype - ",i)}return!1}async function B(t,i){if(t instanceof F.TFile){let o=new Blob([await t.vault.readBinary(t)],{type:`image/${t.extension}`});return i(o)}let e=`https://api.allorigins.win/raw?url=${encodeURIComponent(t)}`,n=[()=>U(t),()=>U(e),()=>b(T,M(t)),()=>b(T,M(e))];for(let o of n){let r=await o();if(r&&await i(r))return!0}return!1}async function U(t){try{return await(await fetch(t,{signal:AbortSignal.timeout(T)})).blob()}catch(i){console.warn("Failed to fetch image - ",i)}return null}async function M(t){return new Promise(i=>{let e=new Image;e.crossOrigin="anonymous",e.onload=()=>{let n=document.createElement("canvas");n.width=e.width,n.height=e.height,n.getContext("2d").drawImage(e,0,0),n.toBlob(o=>{i(o)})},e.onerror=()=>{i(null)},e.src=t})}function h(t){let i=["avif","bmp","gif","jpg","jpeg","png","svg","webp","heic"];return t=t.toLowerCase(),i.some(e=>t.endsWith(`.${e}`))}async function u(t){await B(t,D)?new C.Notice(i18next.t("interface.copied_generic"),1800):new C.Notice(i18next.t("Failed to copy image to clipboard"),1800)}var L=require("obsidian"),O=["file","open","info","system"],x={"copy-url":{section:"info",icon:"link",title:"interface.menu.copy-url"},"copy-to-clipboard":{section:"info",icon:"image-file",title:"interface.label-copy"},"open-in-new-tab":{section:"open",icon:"file-plus",title:"interface.menu.open-in-new-tab"},"open-in-default-app":{section:"system",icon:"arrow-up-right",title:"plugins.open-with-default-app.action-open-file"},"show-in-explorer":{section:"system",icon:"arrow-up-right",title:`plugins.open-with-default-app.action-show-in-folder${L.Platform.isMacOS?"-mac":""}`},"reveal-in-navigation":{section:"system",icon:"folder",title:"plugins.file-explorer.action-reveal-file"},"reveal-in-navigation-tree":{section:"system",icon:"folder",title:"Reveal in File Tree Alternative"},"rename-file":{section:"info",icon:"pencil",title:"interface.menu.rename"}};function l(t,i){return t.setSection(x[i].section).setIcon(x[i].icon).setTitle(i18next.t(x[i].title))}var A=require("obsidian");function P(t,i){let e=(0,A.normalizePath)(t.vault.adapter.basePath);e=e.replace("file://","");let n=i.pathname;n=n.replace("/_capacitor_file_",""),n=n.split("/").filter(r=>r!=="").join("/");let o=decodeURI(n);if(o.startsWith(e)){let r=o.slice(e.length+1);return t.vault.getFileByPath(r)}return null}function v(t,i){t.workspace.getLeaf(!0).openFile(i,{active:!0})}var w=class extends p.Plugin{constructor(){super(...arguments);d(this,"canvasCardMenu");d(this,"settings")}async loadSettings(){this.settings=Object.assign({},S,await this.loadData())}async saveSettings(){await this.saveData(this.settings)}async onload(){await this.loadSettings(),this.addSettingTab(new f(this.app,this)),this.registerDocument(document),this.app.workspace.on("window-open",(e,n)=>{this.registerDocument(n.document)}),this.registerEvent(this.app.workspace.on("file-menu",(e,n,o)=>{o==="canvas-menu"&&n instanceof p.TFile&&h(`.${n.extension}`)&&(e.addItem(r=>l(r,"open-in-new-tab").onClick(()=>{v(this.app,n)})),e.addItem(r=>l(r,"copy-to-clipboard").onClick(()=>{u(n)})))})),this.registerEvent(this.app.workspace.on("canvas:node-menu",(e,n)=>{let o=n.unknownData;if(o.type==="link"){let r=y(o.url);if(!h(r))return;e.addItem(s=>l(s,"copy-to-clipboard").setSection("canvas").onClick(()=>{u(r)}))}})),this.registerEvent(this.app.workspace.on("url-menu",(e,n)=>{n=y(n),h(n)&&e.addItem(o=>l(o,"copy-to-clipboard").onClick(()=>{u(n)}))}))}registerDocument(e){let n=[I(e,"contextmenu","img",this.onImageContextMenu.bind(this),{capture:!0}),I(e,"mouseup","img",this.onImageMouseUp.bind(this))];this.register(()=>{for(let o of n)o()})}onImageContextMenu(e){var k;if(!this.settings.enableDefaultOnCanvas&&((k=this.app.workspace.getActiveFile())==null?void 0:k.extension)==="canvas")return;e.preventDefault();let n=e.target,o=new URL(n.src);if(!["app:","data:","http:","https:"].includes(o.protocol)){new p.Notice(`No handler for ${o.protocol} protocol`);return}let s=p.Menu.forEvent(e),c=P(this.app,o),E=!!n.closest(".markdown-reading-view");s.addSections(Array.from(O)),c&&E?(s.addItem(a=>l(a,"rename-file").onClick(()=>this.app.fileManager.promptForFileRename(c))),s.addItem(a=>l(a,"copy-to-clipboard").onClick(()=>{u(c)})),p.Platform.isMobile&&s.addItem(a=>a.setTitle(c.name).setSection("file").setIsLabel(!0)),s.addItem(a=>l(a,"open-in-new-tab").onClick(()=>{v(this.app,c)})),p.Platform.isDesktop&&(s.addItem(a=>l(a,"open-in-default-app").onClick(()=>{this.app.openWithDefaultApp(c.path)})),s.addItem(a=>l(a,"show-in-explorer").onClick(()=>{this.app.showInFolder(c.path)}))),this.settings.revealInNavigation&&s.addItem(a=>l(a,"reveal-in-navigation").onClick(()=>{var N;(N=this.app.internalPlugins.getEnabledPluginById("file-explorer"))==null||N.revealInFolder(c)})),this.app.plugins.enabledPlugins.has("file-tree-alternative")&&s.addItem(a=>l(a,"reveal-in-navigation-tree").onClick(()=>{self.dispatchEvent(new CustomEvent("fta-reveal-file",{detail:{file:c}}))}))):c||(E&&s.addItem(a=>l(a,"copy-to-clipboard").onClick(()=>{u(n.src)})),s.addItem(a=>l(a,"copy-url").onClick(()=>{navigator.clipboard.writeText(o.href),new p.Notice(i18next.t("interface.copied",{item:"URL"}),1e3)}))),s.showAtMouseEvent(e)}onImageMouseUp(e){let n=e.target;if(e.button===1&&this.settings.middleClickNewTab){let r=P(this.app,new URL(n.src));if(!r)return;v(this.app,r)}}}; - -/* nosourcemap */ \ No newline at end of file diff --git a/.obsidian/plugins/copy-url-in-preview/manifest.json b/.obsidian/plugins/copy-url-in-preview/manifest.json deleted file mode 100644 index 95296ea..0000000 --- a/.obsidian/plugins/copy-url-in-preview/manifest.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "id": "copy-url-in-preview", - "name": "Image Context Menus", - "version": "1.12.1", - "minAppVersion": "1.12.3", - "description": "Copy to clipboard, Copy URL, Open in default app, Show in system explorer, Reveal file in navigation, Open in new tab, Rename context menus for images.", - "author": "NomarCub", - "authorUrl": "https://github.com/NomarCub", - "fundingUrl": "https://ko-fi.com/nomarcub", - "isDesktopOnly": false -} diff --git a/.obsidian/plugins/recent-files-obsidian/data.json b/.obsidian/plugins/recent-files-obsidian/data.json index 5e2ff8e..f99f29f 100644 --- a/.obsidian/plugins/recent-files-obsidian/data.json +++ b/.obsidian/plugins/recent-files-obsidian/data.json @@ -1,5 +1,49 @@ { "recentFiles": [ + { + "basename": "IBS 智能体具体落实技术方案", + "path": "work/移动杭研/AI 项目/IBS 智能体具体落实技术方案.md" + }, + { + "basename": "ibs-ai 项目梳理", + "path": "work/移动杭研/AI 项目/ibs-ai 项目梳理.md" + }, + { + "basename": "图纸-IBS 智能体-v3-项目架构", + "path": "work/移动杭研/AI 项目/图纸-IBS 智能体-v3-项目架构.md" + }, + { + "basename": "图纸-IBS 智能体-v2-项目架构 原生 MCP", + "path": "work/移动杭研/AI 项目/图纸-IBS 智能体-v2-项目架构 原生 MCP.md" + }, + { + "basename": "图纸-IBS 智能体-v1-流量查询 demo 对象存储", + "path": "work/移动杭研/AI 项目/图纸-IBS 智能体-v1-流量查询 demo 对象存储.md" + }, + { + "basename": "图纸-IBS 智能体-v1-流量查询 demo", + "path": "work/移动杭研/AI 项目/图纸-IBS 智能体-v1-流量查询 demo.md" + }, + { + "basename": "Prompt 公司智能体", + "path": "resource/ai/prompts/Prompt 公司智能体.md" + }, + { + "basename": "20260309173243", + "path": "000-Inbox/20260309173243.md" + }, + { + "basename": "20260309150326", + "path": "000-Inbox/20260309150326.md" + }, + { + "basename": "如何成为一个 React 工程师呢?", + "path": "resource/前端/如何成为一个 React 工程师呢?.md" + }, + { + "basename": "服务器-香港", + "path": "personal/服务器-香港.md" + }, { "basename": "直播源", "path": "personal/电影/直播源.md" @@ -44,18 +88,6 @@ "basename": "ubuntu", "path": "resource/系统/ubuntu.md" }, - { - "basename": "IBS 智能体-v5", - "path": "work/移动杭研/AI 项目/IBS 智能体-v5.md" - }, - { - "basename": "IBS 智能体-v4", - "path": "work/移动杭研/AI 项目/IBS 智能体-v4.md" - }, - { - "basename": "IBS 智能体-v3", - "path": "work/移动杭研/AI 项目/IBS 智能体-v3.md" - }, { "basename": "20260305155494", "path": "000-Inbox/20260305155494.md" @@ -64,18 +96,6 @@ "basename": "开发笔记", "path": "work/移动杭研/开发记录/7.18.0/开发笔记.md" }, - { - "basename": "服务器-香港", - "path": "personal/服务器-香港.md" - }, - { - "basename": "IBS 智能体-v1", - "path": "work/移动杭研/AI 项目/IBS 智能体-v1.md" - }, - { - "basename": "IBS 智能体-v2", - "path": "work/移动杭研/AI 项目/IBS 智能体-v2.md" - }, { "basename": "构建 HUGO 博客的完整指南:从搭建到部署", "path": "resource/系统/构建 HUGO 博客的完整指南:从搭建到部署.md" @@ -92,10 +112,6 @@ "basename": "vim 快捷键与操作手册", "path": "resource/系统/vim 快捷键与操作手册.md" }, - { - "basename": "React 工程师", - "path": "resource/前端/React 工程师.md" - }, { "basename": "VSCode 配置文件", "path": "resource/配置/VSCode 配置文件.md" @@ -179,22 +195,6 @@ { "basename": "结婚相关", "path": "personal/个人/结婚相关.md" - }, - { - "basename": "昌平医院", - "path": "personal/个人/昌平医院.md" - }, - { - "basename": "TG 备忘录", - "path": "personal/TG 备忘录.md" - }, - { - "basename": "路由器", - "path": "personal/路由器.md" - }, - { - "basename": "王欣", - "path": "personal/家人/王欣.md" } ], "omittedPaths": [ diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 163444f..8b0c9cd 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -4,17 +4,22 @@ "type": "split", "children": [ { - "id": "6b428b85f883f637", + "id": "4b5820367a78b7bd", "type": "tabs", "children": [ { - "id": "5495c7466557ec58", + "id": "4695be4ed62c6a04", "type": "leaf", "state": { - "type": "empty", - "state": {}, + "type": "markdown", + "state": { + "file": "work/移动杭研/AI 项目/IBS 智能体具体落实技术方案.md", + "mode": "source", + "source": false, + "backlinks": false + }, "icon": "lucide-file", - "title": "新标签页" + "title": "IBS 智能体具体落实技术方案" } } ] @@ -50,9 +55,9 @@ "state": { "type": "search", "state": { - "query": "file: 常用", + "query": "file:react", "matchingCase": false, - "explainSearch": false, + "explainSearch": true, "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical" @@ -92,7 +97,7 @@ } ], "direction": "horizontal", - "width": 218.5 + "width": 507.5 }, "right": { "id": "ca733f6d5936ae40", @@ -101,7 +106,7 @@ { "id": "1f21045435bfa327", "type": "tabs", - "dimension": 57.88834951456311, + "dimension": 57.8883495145631, "children": [ { "id": "43a2e8e1d9201229", @@ -109,12 +114,13 @@ "state": { "type": "outline", "state": { + "file": "work/移动杭研/AI 项目/IBS 智能体具体落实技术方案.md", "followCursor": true, "showSearch": false, "searchQuery": "" }, "icon": "lucide-list", - "title": "大纲" + "title": "IBS 智能体具体落实技术方案 的大纲" } }, { @@ -196,7 +202,7 @@ { "id": "ea8a40d57ef90e62", "type": "tabs", - "dimension": 42.11165048543689, + "dimension": 42.1116504854369, "children": [ { "id": "499dbd491c6fb256", @@ -226,34 +232,34 @@ "obsidian-excalidraw-plugin:New drawing": false } }, - "active": "c8718c0c63702202", + "active": "4695be4ed62c6a04", "lastOpenFiles": [ + "work/移动杭研/AI 项目/ibs-ai 项目梳理.md", + "work/移动杭研/AI 项目/IBS 智能体具体落实技术方案.md", + "work/移动杭研/AI 项目/MCP Prompt.md", + "work/移动杭研/AI 项目/图纸-IBS 智能体-v3-项目架构.md", + "work/移动杭研/AI 项目/图纸-IBS 智能体-v2-项目架构 原生 MCP.md", + "work/移动杭研/AI 项目/图纸-IBS 智能体-v1-流量查询 demo 对象存储.md", + "work/移动杭研/AI 项目/图纸-IBS 智能体-v1-流量查询 demo.md", + "work/移动杭研/AI 项目/IBS 智能体-v4.md", + "work/移动杭研/AI 项目/IBS 智能体-v3-遗弃.md", + "resource/ai/prompts/Prompt 公司智能体.md", + "calendar/diary/2026-03-10.md", + "000-inbox/20260309173243.md", + "000-inbox/20260309150326.md", "calendar/diary/2026-03-09.md", + "calendar/diary/2026-03-08.md", + "calendar/weeks/2026-W10.md", "calendar/diary/2026-03-07.md", "calendar/diary/2026-03-06.md", - "000-inbox/20260307154181.md", - "personal/电影/直播源.md", - "000-inbox/20260307145692.md", - "000-Inbox/20260307145692.md", - "000-Inbox/20260307154181.md", - "000-Inbox/20260307181838.md", - "000-Inbox/20260306180056.md", - "000-inbox/20260306180056.md", - "000-Inbox/20260306180077.md", - "000-inbox/20260306180077.md", - "000-inbox/tg-bot.md", - "000-Inbox/20260306143237.md", - "resource/工具/rime/Rime 快捷键.md", - "resource/组件/Ubuntu 24.04 LTS ELK 8 安装指南.md", - "000-Inbox/20260306145821.md", "calendar/diary/2026-03-05.md", "calendar/diary/2026-03-04.md", - "resource/常用命令.md", - "000-inbox/20260306145821.md", - "000-inbox/20260306143237.md", - "work/移动杭研/项目备忘/环境账号.md", - "excalidraw/Drawing 2026-03-06 08.49.09.excalidraw.md", - "excalidraw/Drawing 2026-03-06 08.42.40.excalidraw.md", + "calendar/diary/2026-03-03.md", + "calendar/diary/2026-03-02.md", + "000-Inbox/20260309173243.md", + "000-Inbox/20260309150326.md", + "resource/前端/如何成为一个 React 工程师呢?.md", + "personal/服务器-香港.md", "resource/工具/rime", "attachment/images-paste/image-20260304153545122.png", "work/移动杭研/开发记录/7.19.0", diff --git a/calendar/diary/2026-03-08.md b/calendar/diary/2026-03-08.md new file mode 100644 index 0000000..9f56397 --- /dev/null +++ b/calendar/diary/2026-03-08.md @@ -0,0 +1,9 @@ +# 任务 + +# 日志 + +# 总结 + +上午起来看了一些关于 F1 的资讯,然后我准备把 OpenClaw 弄一下。 + +中午去王繁星面馆吃面。 diff --git a/calendar/diary/2026-03-09.md b/calendar/diary/2026-03-09.md index c4bb7ae..ca8a4a8 100644 --- a/calendar/diary/2026-03-09.md +++ b/calendar/diary/2026-03-09.md @@ -1,7 +1,21 @@ # 任务 +- [x] 开发:参加 IBS 项目晨会,同步昨日问题跟进事项。(李春良 0.5) - [x] 开发:梳理 IBS V7.19.0 需求。(新业务平面引入与系统集成实施 李春良 4) +- [x] 项目:IBS 智能体具体落实技术方案调研。(李春良 3) # 日志 +feat: 初始化 MCP 服务端项目 + +聊天智能体,用户输入,先进行语义路由,是走知识库进行概念问题解答,还是走 MCP 智能体,可以根据我公司提供的 MCP 服务器进行选择使用,将结果经过 ai 润色后答疑。 + # 总结 + +今天体验了 RAG Flow、Dify、n8n,让我感觉到了自己在智能体方面的能力缺失,如果早体验这个圈子。自己的思维会更上一层。 + +今天实现了 MCP 的自动注册。 + +晚上回家田宝在玩儿水。 + +今天智齿要了命了。这次消肿了一定要去拔了。 diff --git a/calendar/diary/2026-03-10.md b/calendar/diary/2026-03-10.md new file mode 100644 index 0000000..8b80bf2 --- /dev/null +++ b/calendar/diary/2026-03-10.md @@ -0,0 +1,9 @@ +# 任务 + +- [x] 开发:参加 IBS 项目晨会,同步昨日问题跟进事项。(李春良 0.5) +- [ ] 开发:梳理 IBS V7.19.0 需求。(新业务平面引入与系统集成实施 李春良 4) +- [ ] 项目:IBS 智能体具体落实技术方案调研。(李春良 3) + +# 日志 + +# 总结 diff --git a/calendar/weeks/2026-W10.md b/calendar/weeks/2026-W10.md new file mode 100644 index 0000000..ca4b4af --- /dev/null +++ b/calendar/weeks/2026-W10.md @@ -0,0 +1 @@ +需求自测、IBS AI 调研、元宵节、日全食、MCP Demo、第一次参与会议 AI 会议、obsidian、AI 开发规范、幼儿园、F1 开赛、OpenClaw、王繁星 diff --git a/work/移动杭研/AI 项目/公司智能体.md b/resource/ai/prompts/Prompt 公司智能体.md similarity index 100% rename from work/移动杭研/AI 项目/公司智能体.md rename to resource/ai/prompts/Prompt 公司智能体.md diff --git a/resource/前端/React 工程师.md b/resource/前端/React 工程师.md deleted file mode 100644 index 38c83ce..0000000 --- a/resource/前端/React 工程师.md +++ /dev/null @@ -1,72 +0,0 @@ -# 关于 Node - -| Node.js | Java | -| --------------- | ----------- | -| Node.js version | JDK version | -| V8 Engine | JVM | -| npm | Maven | -| N-API | JNI | - -## Node.js 版本 - -[Node.js — Node.js 版本](https://nodejs.org/zh-cn/about/previous-releases) - -# 学习资料 - -https://u19tul1sz9g.feishu.cn/docx/WEWJdSzF5oTnwvxHGGAc0Vojnxe?from=from_copylink - -密码:M6923&65 - -# 第一章 开发环境与核心概念 - -UI = f(State) - -用户界面仅仅是应用程序状态的一个函数 - -初始化环境 - -``` -pnpm create vite@latest basic --template react-ts -``` - -导入方式: - -具名导入: - -``` -import { ... } from 'react' -``` - -默认导入: - -``` -import ... from 'react' -``` - -副作用导入: - -``` -import './index.css' -``` - -# CSS - -顶级作用域 - -``` -:root { -``` - -媒体查询 - -``` -@media (prefers-color-scheme: light) { - -} -``` - -ID 选择器 - -``` -#root -``` diff --git a/resource/前端/如何成为一个 React 工程师呢?.md b/resource/前端/如何成为一个 React 工程师呢?.md new file mode 100644 index 0000000..dfb693b --- /dev/null +++ b/resource/前端/如何成为一个 React 工程师呢?.md @@ -0,0 +1,192 @@ +# 学习资料 + +https://u19tul1sz9g.feishu.cn/docx/WEWJdSzF5oTnwvxHGGAc0Vojnxe?from=from_copylink + +密码:M6923&65 + +# 关于 Node 的理解 + +| Node.js | Java | +| --------------- | ----------- | +| Node.js version | JDK version | +| V8 Engine | JVM | +| Npm | Maven | +| N-API | JNI | + +``` + ┌───────────────┐ + │ JS APP │ + └───────▲───────┘ + │ + ┌───────┴───────┐ + │ NPM │ ← 包管理 & 生态 + └───────▲───────┘ + │ + ┌───────┴───────┐ + │ Node.js │ ← Runtime(API / EventLoop / Libuv) + └───────▲───────┘ + │ + ┌───────┴───────┐ + │ V8 │ ← JS 引擎 + └───────▲───────┘ + │ + 操作系统 +``` + +## Node.js 版本 + +[Node.js](https://nodejs.org/zh-cn/about/previous-releases) 采用固定节奏发布 + LTS 生命周期,每 6 个月发布一个,相当于每年会覆盖一个 LTS。 + +# 第一章 开发环境与核心概念 + +初始化环境 + +```bash +pnpm create vite@latest basic2 --template react-ts +``` + +所谓的优雅公式:`UI = f(State)`,用户界面仅仅是应用程序状态的一个函数。 + +JSX 不是 HTML 而是 JavaScript 的一种特殊语法。我们编写的每一行 JSX 代码最后都会被转换为一个函数:`React.createElement()` + +> 例如: +> `