您当前的位置:首页 >> 家居优品

使用 Node.js 和 SQLite 构建离线须要应用程序

2023-03-12 12:16:26

>

});

每一次,我们将创建人一个网志沙罗,将其打印在我们的在线里面,先于适用都有标识符完整版呈现到IP:

激活

let blogs = [

{

id: "1",

title: "How To Build A RESTAPI With Javascript",

avatar: "images/coffee2.jpg",

intro: "iste odio beatae voluptas dolor praesentium illo facere optio nobis magni, aspernatur quas.",

},

{

id: "2",

title: "How to Build an Offline-First Application with Node.js,"

avatar: "images/coffee2.jpg",

"iste odio beatae voluptas dolor praesentium illo facere optio nobis magni, aspernatur quas.",

},

{

id: "3",

title: "Building a Trello Clone with React DnD",

avatar: "images/coffee2.jpg",

intro: "iste odio beatae voluptas dolor praesentium illo facere optio nobis magni, aspernatur quas.",

},

];

我们API里面的每个块天涯社区都有一个id、title、 avatar和intro字段。

过去创建人一个在线表取名blogs并适用后面的标识符完整版留存我们刚刚在后面创建人的网志详细信息:

激活

db.run(

MLT-CREATE TABLE blog (id INTEGER PRIMARY KEY AUTOINCREMENT, title text,avatar text,intro text)MLT-,

(err) => {

if (err) {

// console.log(err)

// Table already created

} else {

// Table just created, creating some rows

var insert = "INSERT INTO blogs (title, avatar, intro) VALUES (?,?,?)";

blogs.map((blog) => {

db.run(insert, [

MLT-${blog.title}MLT-,

MLT-${blog.avatar}MLT-,

MLT-${blog.intro}MLT-,

]);

});

}

}

);

在标识符完整版里面,我们适用db.run 创建人了一个表blogs 。db.run分析方法接深受一个 SQL 查询作为参数,然后我们遍历我们的网志统计数据类型并将它们插入到我们刚刚适用 js map 函数创建人的 blogs 表里面。

提示在线详细描述

过去让我们提示我们刚刚适用Arctype创建人的详细描述。要适用 Arctype 提示 SQLite 在线里面的详细描述,请监督都有步骤:

装上 Arctype 运营APInode index.js以创建人在线 触发 Arctype 并单击 SQLite 选项卡

单击 Select SQLite file鼠标,找到运营一站式器时分解成的db.sqlite副本。 您应想到 blogs 表和我们创建人的详细描述,如后面的鼠标截图所示:

过场的网站

此时,我们已将API联接到 SQLite 在线,并在在线里面插入了一些详细描述。过去,推开index.html副本并在后面添加都有标识符完整版:

激活

Blogger

Blogger

Home

Blog

我们在后面的副本里面创建人了一个简单的后面,其里面还包括看成我们指南的元数据,我们将在下一其余部分、styles和app.js副本里面创建人它。

然后,我们将在index.js 副本里面创建人一个blogs统计数据流,以将网志回到到IP。

激活

app.get("/blogs", (req, res) => {

res.status(200).json({

blogs,

});

});

在我们的public/js/app.js副本里面,我们将向网志端点发送一个获取请求,以从我们的后端获取网志。然后我们遍历网志,导向器皿类并推测它们。

激活

let result = "";

fetch("")

.then((res) => res.json())

.then(({ rows } = data) => {

rows.forEach(({ title, avatar, intro } = rows) => {

result += MLT-

${title}

${intro}

Read

MLT-;

});

document.querySelector(".container").innerHTML = result;

})

.catch((e) => {

console.log(e);

});

我们还将适用都有标识符完整版在public/css/style.css 里面为我们的API添加一些样式:

激活

* {

margin: 0;

padding: 0;

box-sizing: border-box;

}

body {

background: #fdfdfd;

font-size: 1rem;

}

section {

max-width: 900px;

margin: auto;

padding: 0.5rem;

text-align: center;

}

nav {

display: flex;

justify-content: space-between;

align-items: center;

}

ul {

list-style: none;

display: flex;

}

li {

margin-right: 1rem;

}

h1 {

color: #0e9c95;

margin-bottom: 0.5rem;

}

.container {

display: grid;

grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr));

grid-gap: 1rem;

justify-content: center;

align-items: center;

margin: auto;

padding: 1rem 0;

}

.card {

display: flex;

align-items: center;

flex-direction: column;

width: 15rem auto;

background: #fff;

box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23);

border-radius: 10px;

margin: auto;

overflow: hidden;

}

.card-avatar {

width: 100%;

height: 10rem;

object-fit: cover;

}

.card-title {

color: #222;

font-weight: 700;

text-transform: capitalize;

font-size: 1.1rem;

margin-top: 0.5rem;

}

.card-link {

text-decoration: none;

background: #16a0d6e7;

color: #fff;

padding: 0.3rem 1rem;

border-radius: 20px;

margin: 10px;

}

.intro {

color: #c2c5c5;

padding: 10px;

}

.active {

color: #16a0d6e7;

}

过去推开package.json副本并添加触发脚本。

激活

"start": "node index.js"

从此以后,我们仍未设了我们的API。但是当一站式器很难运营或者很难网络联接用于生产时,我们无法运营我们的API。让我们在下一节里面顺利完成设。

优化应用领域

我们只能够使我们的API与所有鼠标尺寸兼容。我们还将通过在index.html 副本的 head 其余部分添加后面的后面来添加题材白色。

激活

创建人指南

我们只能够描述我们的API以及它在装上在服务器端设备上时的不道德手段。我们可以通过创建人指南来做到这一点。

在项目默认下创建人manifest副本,添加如下可用:

激活

{

"name": "Blogger"

"short_name": "Blogger"

"start_url": "/",

"display": "standalone",

"background_color": "#0e9c95",

"theme_color": "#16a0d6e7",

"orientation": "portrait",

"icons": []

}

在我们的指南里面,我们假定了都有可用:

name:这假定了API的推测名称。 short_name:这假定了装上时将在API自定义下推测的名称。 start_url:这告诉他JavaScriptAPI的根 URL。 display:这告诉他JavaScript如何推测API。 background_color: 这假定了装上时API的氛围白色。 theme_color: 这假定了状态栏的白色。 方向: 这假定了在应用领域推测期间适用的方向。 自定义: 这假定了完全相同形状的自定义或图像用作我们的API主页自定义。

手动创建人我们的主鼠标自定义可能是一项非常复杂的任务,但不必顾虑。我们将能用取名pwa-asset-generator的第三方模块,适用都有号令从公共目录里面的主API自定义分解成完全相同形状的自定义:

激活

#change directory to the public folder

cd public

#generate icons

npx pwa-asset-generator logo.png icons

后面的号令将在 public 副本夹里面创建人一个自定义 副本夹,其里面还包括我们API的许多自定义,以及终端上的一些JSON,我们将粘贴到指南里面的自定义统计数据类型里面。

我们指南里面的自定义统计数据类型应如下所示:

激活

"icons": [

{

"src": "public/icons/manifest-icon-192.maskable.png",

"sizes": "192x192",

"type": "image/png",

"purpose": "any"

},

{

"src": "public/icons/manifest-icon-192.maskable.png",

"sizes": "192x192",

"type": "image/png",

"purpose": "maskable"

},

{

"src": "public/icons/manifest-icon-512.maskable.png",

"sizes": "512x512",

"type": "image/png",

"purpose": "any"

},

{

"src": "public/icons/manifest-icon-512.maskable.png",

"sizes": "512x512",

"type": "image/png",

"purpose": "maskable"

}

]

此外,该号令分解成了看成分解成的自定义的后面元数据。

将后面激活并粘贴到public/index.html 副本里面后面的 head 其余部分。

设一站式从业者

创建人指南后,让我们设一站式从业者。Service Worker 是一段 JavaScript 标识符,您的JavaScript在后台运营在一个除此以外的寄存器里面,以处理您为预见的请求留存的金融机构和统计数据的寄存器,从而为您的API动工FTP支持者。

所以在public 副本夹里面创建人一个blogger.serviceWorker.js 副本。对于 service worker,有很多惨案(push、activate、install、fetch、message、sync),但对于本基本知识的演示,我们将介绍install、activate 和fetch 惨案。值得一提的是,我们只能够创建人一个统计数据类型来打印我们在API里面适用的所有金融机构。

激活

const assets = [

"/",

"css/style.css",

"js/app.js",

"/images/blog1.jpg",

"/images/blog2.jpg",

"/images/blog3.jpg,"

];

然后,我们将监听install 惨案来申请人并将我们的连续性副本留存到JavaScript的寄存器里面。此过程只能够一些时间才能顺利完成。要跳过准备好,我们将适用skipWaiting()。

激活

const BLOGGER_ASSETS = "blogger-assets";

self.addEventListener("install", (installEvt) => {

installEvt.waitUntil(

caches

.open(BLOGGER_ASSETS)

.then((cache) => {

cache.addAll(assets);

})

.then(self.skipWaiting())

.catch((e) => {

console.log(e);

})

);

});

然后,我们只能够在 service worker 升级时清除寄存器以删掉旧金融机构。为此,我们将的电台后面的激活 标识符完整版:

激活

self.addEventListener("activate", function (evt) {

evt.waitUntil(

caches

.keys()

.then((keysList) => {

return Promise.all(

keysList.map((key) => {

if (key === BLOGGER_ASSETS) {

console.log(MLT-Removed old cache from ${key}MLT-);

return caches.delete(key);

}

})

);

})

.then(() => self.clients

在后面的标识符完整版里面,我们在 service worker 上适用了waitUntil分析方法。此分析方法准备好操作顺利完成,然后在删掉先前健康检查我们更进一步清除的金融机构是否是我们举例来说API的金融机构。

每一次,我们只能够打印在寄存器里面的副本才能适用它们。

激活

self.addEventListener("fetch", function (evt) {

evt.respondWith(

fetch(evt.request).catch(() => {

return caches.open(BLOGGER_ASSETS).then((cache) => {

return cache.match(evt.request);

});

})

);

})

当在的网站上发出请求时,PWA 将健康检查我们的寄存器并从寄存器里面读取统计数据,而不是去网络。然后,适用respondWith分析方法,我们覆盖JavaScript的默认值并让我们的惨案回到一个 Promise。寄存器顺利完成后,我们可以回到evt.request对应的寄存器。当寄存器准备好后,我们可以回到匹配 evt.request 的寄存器。

我们仍未成功设了我们的 service worker。过去让我们让它在我们的API里面能用。

申请人 Service Worker

过去让我们在public/js/app.js 副本里面申请人我们的 service worker,标识符完整版如下:

激活

if ("serviceWorker" in navigator) {

window.addEventListener("load", function () {

navigator.serviceWorker

.register("/blogger.serviceWorker.js")

.then((res) => console.log("service worker registered"))

.catch((err) => console.log("service worker not registered", err));

});

}

在这里,我们健康检查我们的API的JavaScript是否支持者Service Worker(当然不是所有的JavaScript都支持者Service Worker),然后申请人我们的Service Worker 副本。

过去适用都有号令运营API:

激活

npm start

在JavaScript里面转到 localhost:8000 以访问该API。

谷歌两处健康检查

过去让我们健康检查一下我们是否适用Google Lighthouse健康检查确实设了 PWA 。桌面上单击JavaScript并并不能够“健康检查”。在健康检查选项卡上,并不能够两处并单击分解成分析报告。如果您的API一切顺利,您应不会想到如下鼠标截图里面的输出:

我们仍未成功地创建人了我们的第一个API。你还可以停止一站式器以在FTP模式下测试API。

结论

渐进式 Web 应用领域 (PWA) 适用现代 API 通过单个标识符纳缺较少进一步提高的系统、可靠性和可装上性。它们允许您的最终服务器端适用您的API,无论他们是否有互联网联接。您应随时 fork打印纳并向项目添加其他系统。

书名标题:Building Offline-First Apps With Node.js and SQLite

书名编者:Clara Ekekenta

苏州白癜风专科医院哪好
广西男科医院哪家最好
杭州看白癜风去什么医院好
重庆看白癜风去哪好
贵州生殖感染医院哪里好
相关阅读
友情链接