{"version":3,"sources":["utils/check.ts","utils/setting.ts","components/CardV2/index.tsx","components/SearchBar/index.tsx","components/Loading/index.tsx","utils/api.tsx","components/TagSelector/index.tsx","components/AdminEntrance/index.tsx","components/GithubLink/index.tsx","utils/theme.ts","components/DarkSwitch/index.tsx","utils/serachEngine.ts","components/Content/index.tsx","App.tsx","serviceWorker.ts","index.tsx"],"names":["getLogoUrl","url","startsWith","setJumpTarget","target","window","localStorage","setItem","getJumpTarget","getItem","Card","title","des","logo","catelog","onClick","index","isSearching","el","useMemo","src","alt","split","pop","includes","type","showNumIndex","href","undefined","rel","className","SearchBar","props","onKeyDown","ev","code","test","key","document","getElementById","focus","useEffect","addEventListener","removeEventListener","id","placeholder","value","searchString","onChange","v","setSearchText","Loading","FetchList","headers","axios","get","raw","data","tools","catelogs","push","forEach","item","name","setting","jumpTargetBlank","jumpTarget","desc","TagSelector","tags","onTagChange","currTag","renderTags","useCallback","map","each","AdminEntrance","xmlns","viewBox","width","height","d","GithubLink","version","decodeTheme","t","Date","getHours","night","matchMedia","matches","decodeAuto","applyTheme","source","disableLog","querySelector","classList","toggle","console","log","initTheme","theme","DarkSwitch","showGithub","useState","setTheme","current","useRef","hasInit","currentTimer","timer","clearInterval","realTheme","setInterval","useLayoutEffect","iTheme","lightIcon","fill","darkIcon","autoIcon","generateSearchEngineCard","trim","searchBaidu","hide","searchBing","searchGoogle","q","mutiSearch","s","toLowerCase","rawInclude","pinYinInlcude","Boolean","pinyin","match","Content","setData","loading","setLoading","setCurrTag","setSearchString","val","setVal","filteredDataRef","hideGithub","showAdmin","hideAdmin","loadData","r","tagInLocalStorage","resetSearch","notSetTag","filteredData","localResult","filter","onKeyEnter","renderCardsV2","thisTarget","toggleJumpTarget","cards","keyCode","length","open","ctrlKey","metaKey","num","Number","isNaN","preventDefault","Helmet","charSet","favicon","handleSetSearch","tag","govRecord","App","isLocalhost","location","hostname","registerValidSW","swUrl","config","navigator","serviceWorker","register","then","registration","onupdatefound","installingWorker","installing","onstatechange","state","controller","onUpdate","onSuccess","catch","error","ReactDOM","render","URL","process","origin","fetch","response","contentType","status","indexOf","ready","unregister","reload","checkValidServiceWorker"],"mappings":"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","file":"static/js/main.4ac62ce3.chunk.js","sourcesContent":["export const isLogin = () => {\n return localStorage.getItem('_token') ? true : false\n}\n\nexport const getLogoUrl = (url: string) => {\n if (url.startsWith('http')) {\n return `/api/img?url=${url}`\n } else {\n return url;\n }\n} ","type JumpTarget = 'blank' | 'self';\n\nexport const toggleJumpTarget = () => {\n const thisTarget = getJumpTarget();\n if (!thisTarget) {\n setJumpTarget('blank');\n }\n if (thisTarget === 'blank') {\n setJumpTarget('self');\n } else {\n setJumpTarget('blank');\n }\n\n}\n\nconst setJumpTarget = (target: JumpTarget) => {\n window.localStorage.setItem('jumpTarget', target);\n}\n\nexport const getJumpTarget = () => {\n return window.localStorage.getItem('jumpTarget') as JumpTarget;\n}\n\n\nexport const initServerJumpTargetConfig = (setting: any) => {\n if (!window.localStorage.getItem(\"initedServerJumpTarget\")) {\n window.localStorage.setItem(\"initedServerJumpTarget\", \"true\");\n if (setting.jumpTargetBlank === undefined || setting.jumpTargetBlank === undefined || setting.jumpTargetBlank=== true) {\n setJumpTarget(\"blank\")\n } else {\n setJumpTarget(\"self\")\n }\n }\n}","import { useMemo } from \"react\";\r\nimport \"./index.css\";\r\nimport { getLogoUrl } from \"../../utils/check\";\r\nimport { getJumpTarget } from \"../../utils/setting\";\r\nconst Card = ({ title, url, des, logo, catelog, onClick, index, isSearching }) => {\r\n const el = useMemo(() => {\r\n if (url === \"admin\") {\r\n return {title}\r\n } else {\r\n if (logo.split(\".\").pop().includes(\"svg\")) {\r\n return \r\n } else {\r\n return {title}\r\n }\r\n }\r\n }, [logo, title, url])\r\n const showNumIndex = index < 10 && isSearching;\r\n return (\r\n {\r\n onClick();\r\n }}\r\n target={getJumpTarget() === \"blank\" ? \"_blank\" : \"_self\"}\r\n rel=\"noreferrer\"\r\n className=\"card-box\"\r\n >\r\n {showNumIndex && {index + 1}}\r\n
\r\n
\r\n {el}\r\n {/* {url === \"admin\" ? (\r\n {title}\r\n ) : (\r\n {title}\r\n )} */}\r\n
\r\n
\r\n
\r\n {title}\r\n {catelog}\r\n
\r\n
{des}
\r\n
\r\n
\r\n \r\n );\r\n};\r\n\r\nexport default Card;\r\n","import { useEffect } from \"react\";\r\nimport \"./index.css\";\r\n// import { useState } from 'react';\r\n\r\ninterface SearchBarProps {\r\n setSearchText: (t: string) => void;\r\n searchString: string;\r\n}\r\nconst SearchBar = (props: SearchBarProps) => {\r\n const onKeyDown = (ev) => {\r\n const reg = /[a-zA-Z0-9]|[\\u4e00-\\u9fa5]/g;\r\n if (ev.code === \"Enter\" || reg.test(ev.key)) {\r\n const el = document.getElementById(\"search-bar\");\r\n if (el) {\r\n el.focus();\r\n }\r\n }\r\n }\r\n useEffect(() => {\r\n document.addEventListener(\"keydown\", onKeyDown);\r\n return () => {\r\n document.removeEventListener(\"keydown\", onKeyDown)\r\n }\r\n })\r\n return (\r\n
\r\n
\r\n {\r\n const v = ev.target.value\r\n props.setSearchText(v);\r\n }}\r\n >\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default SearchBar;\r\n","import \"./index.css\";\nexport const Loading = (props: any) => {\n return (\n
\n
\n
\n
\n
\n
\n
\n
\n );\n};\n","import axios from \"axios\";\r\nimport { getJumpTarget, initServerJumpTargetConfig } from \"./setting\";\r\n\r\nconst baseUrl = \"/api/\";\r\n// const baseUrl = \"https://tools.mereith.com/api/\";\r\n\r\nconst selfJumpIcon = `data:image/png;base64,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`\r\nconst blankJumpIcon = `data:image/png;base64,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`\r\nexport const FetchList = async () => {\r\n // 设置请求头部信息\r\n const headers = {\r\n 'Token': localStorage.getItem('_token')\r\n };\r\n const { data: raw } = await axios.get(baseUrl, {headers});\r\n const { data } = raw;\r\n // 获取分类\r\n const catelogs = [];\r\n const tools = [];\r\n catelogs.push(\"全部工具\")\r\n data.catelogs.forEach(item => {\r\n catelogs.push(item.name)\r\n })\r\n data.tools.forEach(item => {\r\n // 如果工具所属分类不存在,则增加分类\r\n // 2024-05-29,只对未分类的工具进行分类,已分类但是没有查到对应分类的,大概是是隐藏了分类,不做展示\r\n if (!item.catelog) {\r\n item.catelog = \"未分类\" \r\n tools.push(item);\r\n if (!catelogs.includes(item.catelog)) {\r\n catelogs.push(item.catelog);\r\n }\r\n } else {\r\n if (catelogs.includes(item.catelog)) {\r\n tools.push(item);\r\n }\r\n }\r\n // 提醒:不做分类展示,仍然会在全部工具中显示\r\n });\r\n if (data.setting) {\r\n initServerJumpTargetConfig(data.setting)\r\n }\r\n\r\n const jumpTarget = getJumpTarget();\r\n\r\n tools.push({\r\n id: 999099999978,\r\n catelogs: \"偏好设置\",\r\n name: jumpTarget === \"blank\" ? \"新建窗口\" : \"原地跳转\",\r\n desc: `点击切换跳转方式`,\r\n url: \"toggleJumpTarget\",\r\n logo: jumpTarget === \"blank\" ? blankJumpIcon : selfJumpIcon\r\n })\r\n\r\n data.tools = tools;\r\n data.catelogs = catelogs;\r\n return data;\r\n};\r\n\r\nexport default FetchList;\r\n\r\n\r\n","import \"./index.css\";\nimport { useCallback } from \"react\";\ninterface TagSelectorProps {\n tags: any;\n onTagChange: (newTag: string) => void;\n currTag: string;\n}\nconst TagSelector = (props: TagSelectorProps) => {\n const { tags = [\"all\"], onTagChange, currTag } = props;\n const renderTags = useCallback(() => {\n const originTags = tags.map((each) => {\n return (\n {\n onTagChange(each);\n }}\n >\n {each}\n \n );\n });\n return originTags;\n }, [tags, onTagChange, currTag]);\n return (\n
\n
\n {renderTags()}\n
\n
\n );\n};\n\nexport default TagSelector;\n","import \"./index.css\";\n\n// account-lock-outline\n// \n// \nconst AdminEntrance = () => {\n return (\n
\n \n \n \n \n \n
\n );\n};\nexport default AdminEntrance;\n","import \"./index.css\";\n\nconst GithubLink = () => {\n return (\n
\n \n \n \n \n \n
\n );\n};\nexport default GithubLink;\n","export function decodeAuto() {\n const d = new Date().getHours();\n const night = d > 18 || d < 8;\n if (typeof window == \"undefined\") {\n if (night) {\n return \"auto-dark\";\n } else {\n return \"auto-light\";\n }\n }\n if (night || window.matchMedia(\"(prefers-color-scheme: dark)\").matches) {\n return \"auto-dark\";\n } else {\n return \"auto-light\";\n }\n}\nexport const decodeTheme = (t: \"auto\" | \"light\" | \"dark\") => {\n if (t === \"auto\") {\n return decodeAuto();\n } else {\n return t;\n }\n};\nexport const applyTheme = (t: string, source: string, disableLog: boolean) => {\n if (t.includes(\"light\")) {\n const bodyEl = document.querySelector(\"body\")!;\n bodyEl.classList.toggle(\"dark-mode\", false);\n if (!disableLog) {\n console.log(`[Apply Theme][${source}] ${t}`);\n }\n } else {\n const bodyEl = document.querySelector(\"body\")!;\n bodyEl.classList.toggle(\"dark-mode\", true);\n if (!disableLog) {\n console.log(`[Apply Theme][${source}] ${t}`);\n }\n }\n};\nexport const initTheme = () => {\n if (typeof localStorage == \"undefined\") {\n return \"auto\";\n }\n // 2种情况: 1. 自动。 2.手动\n if (!(\"theme\" in localStorage) || localStorage.theme === \"auto\") {\n return \"auto\";\n } else {\n if (localStorage.theme === \"dark\") {\n return \"dark\";\n } else {\n return \"light\";\n }\n }\n};\n","import { useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport { applyTheme, decodeTheme, initTheme } from \"../../utils/theme\";\nimport \"./index.css\";\n\nconst DarkSwitch = ({ showGithub }: { showGithub: boolean }) => {\n const [theme, setTheme] = useState(initTheme());\n const { current } = useRef({ hasInit: false });\n const { current: currentTimer } = useRef({ timer: null });\n\n useEffect(() => {\n if (currentTimer.timer) {\n clearInterval(currentTimer.timer);\n currentTimer.timer = null;\n }\n localStorage.setItem(\"theme\", theme)\n const realTheme = decodeTheme(theme as any);\n applyTheme(realTheme, 'setTheme', true);\n if (realTheme.includes(\"auto\")) {\n currentTimer.timer = setInterval(() => {\n const realTheme = decodeTheme(\"auto\");\n applyTheme(realTheme, \"autoThemeTimer\", true);\n }, 10000);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [theme])\n\n\n useLayoutEffect(() => {\n if (!current.hasInit) {\n current.hasInit = true;\n if (!!!localStorage.getItem(\"theme\")) {\n // 第一次用默认的\n setTheme(\"auto\");\n } else {\n const iTheme = initTheme();\n setTheme(iTheme);\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const lightIcon = (\n \n );\n const darkIcon = (\n \n )\n const autoIcon = (\n \n )\n const handleSwitch = () => {\n if (theme === \"light\") {\n setTheme(\"dark\");\n } else if (theme === \"dark\") {\n setTheme(\"auto\");\n } else {\n setTheme(\"light\");\n }\n };\n return (\n
\n {theme === \"light\" ? lightIcon : theme === \"dark\" ? darkIcon : autoIcon}\n
\n );\n};\nexport default DarkSwitch;\n","export const generateSearchEngineCard = (searchString: string) => {\n if (!searchString.trim()) return [];\n const result = [\n {\n name: \"使用百度搜索\",\n url: searchBaidu(searchString),\n desc: `在百度中搜索 「${searchString}」`,\n id: 8800880001,\n logo: \"baidu.ico\",\n hide: false\n },\n {\n name: \"使用 Bing 搜索\",\n url: searchBing(searchString),\n desc: `在 Bing 中搜索 「${searchString}」`,\n id: 8800880002,\n logo: \"bing.ico\",\n hide: false\n },\n {\n name: \"使用 Google 搜索\",\n url: searchGoogle(searchString),\n desc: `在 Google 中搜索 「${searchString}」`,\n id: 8800880003,\n logo: \"google.ico\",\n hide: false\n }\n ]\n return result;\n}\n\n\n\nconst searchBaidu = (q: string) => {\n return `https://www.baidu.com/s?wd=${q}`\n}\n\nconst searchGoogle = (q: string) => {\n return `https://www.google.com/search?q=${q}`\n}\n\nconst searchBing = (q: string) => {\n return `https://cn.bing.com/search?q=${q}`\n}","import \"./index.css\";\r\nimport CardV2 from \"../CardV2\";\r\nimport SearchBar from \"../SearchBar\";\r\nimport { Loading } from \"../Loading\";\r\nimport { Helmet } from \"react-helmet\";\r\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\r\nimport FetchList from \"../../utils/api\";\r\nimport TagSelector from \"../TagSelector\";\r\nimport pinyin from \"pinyin-match\";\r\nimport AdminEntrance from \"../AdminEntrance\";\r\nimport GithubLink from \"../GithubLink\";\r\nimport DarkSwitch from \"../DarkSwitch\";\r\nimport { isLogin } from \"../../utils/check\";\r\nimport { generateSearchEngineCard } from \"../../utils/serachEngine\";\r\nimport { toggleJumpTarget } from \"../../utils/setting\";\r\n\r\nconst mutiSearch = (s, t) => {\r\n const source = (s as string).toLowerCase();\r\n const target = t.toLowerCase();\r\n const rawInclude = source.includes(target);\r\n const pinYinInlcude = Boolean(pinyin.match(source, target));\r\n return rawInclude || pinYinInlcude;\r\n};\r\n\r\nconst Content = (props: any) => {\r\n const [data, setData] = useState({});\r\n const [loading, setLoading] = useState(true);\r\n const [currTag, setCurrTag] = useState(\"全部工具\");\r\n const [searchString, setSearchString] = useState(\"\");\r\n const [val, setVal] = useState(\"\");\r\n\r\n const filteredDataRef = useRef([]);\r\n\r\n const showGithub = useMemo(() => {\r\n const hide = data?.setting?.hideGithub === true\r\n return !hide;\r\n }, [data])\r\n const showAdmin = useMemo(() => {\r\n const hide = data?.setting?.hideAdmin === true\r\n return !hide;\r\n }, [data])\r\n\r\n const loadData = useCallback(async () => {\r\n try {\r\n setLoading(true);\r\n const r = await FetchList();\r\n setData(r);\r\n const tagInLocalStorage = window.localStorage.getItem(\"tag\");\r\n if (tagInLocalStorage && tagInLocalStorage !== \"\") {\r\n if (r?.catelogs && r?.catelogs.includes(tagInLocalStorage)) {\r\n setCurrTag(tagInLocalStorage);\r\n }\r\n }\r\n } catch (e) {\r\n console.log(e);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [setData, setLoading, setCurrTag]);\r\n useEffect(() => {\r\n loadData();\r\n }, [loadData]);\r\n\r\n const handleSetCurrTag = (tag: string) => {\r\n setCurrTag(tag);\r\n // 管理后台不记录了\r\n if (tag !== \"管理后台\") {\r\n window.localStorage.setItem(\"tag\", tag);\r\n }\r\n resetSearch(true);\r\n };\r\n\r\n const resetSearch = (notSetTag?: boolean) => {\r\n setVal(\"\");\r\n setSearchString(\"\");\r\n const tagInLocalStorage = window.localStorage.getItem(\"tag\");\r\n if (!notSetTag && tagInLocalStorage && tagInLocalStorage !== \"\" && tagInLocalStorage !== \"管理后台\") {\r\n setCurrTag(tagInLocalStorage);\r\n }\r\n };\r\n\r\n const handleSetSearch = (val: string) => {\r\n if (val !== \"\" && val) {\r\n setCurrTag(\"全部工具\");\r\n setSearchString(val.trim());\r\n } else {\r\n resetSearch();\r\n }\r\n }\r\n\r\n\r\n\r\n const filteredData = useMemo(() => {\r\n if (data.tools) {\r\n const localResult = data.tools\r\n .filter((item: any) => {\r\n if (currTag === \"全部工具\") {\r\n return true;\r\n }\r\n return item.catelog === currTag;\r\n })\r\n .filter((item: any) => {\r\n if (searchString === \"\") {\r\n return true;\r\n }\r\n return (\r\n mutiSearch(item.name, searchString) ||\r\n mutiSearch(item.desc, searchString) ||\r\n mutiSearch(item.url, searchString)\r\n );\r\n });\r\n return [...localResult, ...generateSearchEngineCard(searchString)]\r\n } else {\r\n return [...generateSearchEngineCard(searchString)];\r\n }\r\n }, [data, currTag, searchString]);\r\n\r\n useEffect(() => {\r\n filteredDataRef.current = filteredData\r\n }, [filteredData])\r\n\r\n useEffect(() => {\r\n if (searchString.trim() === \"\") {\r\n document.removeEventListener(\"keydown\", onKeyEnter);\r\n } else {\r\n document.addEventListener(\"keydown\", onKeyEnter);\r\n }\r\n return () => {\r\n document.removeEventListener(\"keydown\", onKeyEnter);\r\n }\r\n // eslint-disable-next-line\r\n }, [searchString])\r\n\r\n const renderCardsV2 = useCallback(() => {\r\n return filteredData.map((item, index) => {\r\n return (\r\n {\r\n resetSearch();\r\n if (item.url === \"toggleJumpTarget\") {\r\n toggleJumpTarget();\r\n loadData();\r\n }\r\n }}\r\n />\r\n );\r\n });\r\n // eslint-disable-next-line\r\n }, [filteredData, searchString]);\r\n\r\n const onKeyEnter = (ev: KeyboardEvent) => {\r\n const cards = filteredDataRef.current;\r\n // 使用 keyCode 防止与中文输入冲突\r\n if (ev.keyCode === 13) {\r\n if (cards && cards.length) {\r\n window.open(cards[0]?.url, \"_blank\");\r\n resetSearch();\r\n }\r\n }\r\n // 如果按了数字键 + ctrl/meta,打开对应的卡片\r\n if (ev.ctrlKey || ev.metaKey) {\r\n const num = Number(ev.key);\r\n if (isNaN(num)) return;\r\n ev.preventDefault()\r\n const index = Number(ev.key) - 1;\r\n if (index >= 0 && index < cards.length) {\r\n window.open(cards[index]?.url, \"_blank\");\r\n resetSearch();\r\n }\r\n }\r\n\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n {data?.setting?.title ?? \"Van Nav\"}\r\n \r\n
\r\n
\r\n {\r\n setVal(t);\r\n handleSetSearch(t);\r\n }}\r\n />\r\n \r\n
\r\n
\r\n
\r\n
\r\n {loading ? : renderCardsV2()}\r\n
\r\n
\r\n \r\n {showAdmin && }\r\n {showGithub && }\r\n \r\n \r\n );\r\n};\r\n\r\nexport default Content;\r\n","import \"./App.css\";\r\nimport Content from \"./components/Content\";\r\nfunction App() {\r\n return (\r\n
\r\n
\r\n \r\n
\r\n
\r\n );\r\n}\r\n\r\nexport default App;\r\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport './index.css';\r\nimport App from './App';\r\nimport * as serviceWorker from \"./serviceWorker\"\r\n// import reportWebVitals from './reportWebVitals';\r\n\r\nconsole.log(\"欢迎使用 Van Nav 项目\")\r\nconsole.log(\"项目地址: https://github.com/mereithhh/van-nav\")\r\n\r\n\r\nReactDOM.render(\r\n ,\r\n document.getElementById('root')\r\n);\r\n\r\nserviceWorker.register(null);\r\n"],"sourceRoot":""}