您当前的位置:首页 >> 家居资讯

使用 Node.js 和 SQLite 构建其他用户优先应用程序

2023-03-12 12:16:26

");

}

});

在此之后,我们将成立一个新浪沙罗,将其打印在我们的图详见库中的,先前常用详见列出编译器影片显现到客户后端:

激活

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.",

},

];

我们软件界面中的的每个块帖子都有一个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 运转软件界面node index.js以成立图详见库 启动时 Arctype 并默认 SQLite 选项卡

默认 Select SQLite file按钮,找到运转增值器时生成的db.sqlite副本。 您应当该看着 blogs 详见和我们成立的纪录,如比如说的萤幕截图所示:

着色网址

此时,我们已将软件界面连接上来到 SQLite 图详见库,并在图详见库中的插入了一些纪录。从前,弹出index.html副本并在比如说去除详见列出编译器影片:

激活

Blogger

Blogger

Home

Blog

我们在上面的副本中的成立了一个简便的上标,其中的构成指向我们名册的绑定,我们将在下一以外、styles和app.js副本中的成立它。

然后,我们将在index.js 副本中的成立一个blogsIP,以将新浪赶回到客户后端。

激活

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 中的为我们的软件界面去除一些外形上:

激活

* {

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"

业已,我们不太意味著设为了我们的软件界面。但是当增值器没有运转或者没有网络该平台连接上来使用生产时,我们只能运转我们的软件界面。让我们在下一节中的进行设为。

优化应当用

我们所需使我们的软件界面与所有萤幕材质适配。我们还将通过在index.html 副本的 head 以外去除比如说的上标来去除正旨颜色。

激活

成立名册

我们所需描述我们的软件界面以及它在装有在软件设备上时的行为方式。我们可以通过成立名册来算是这一点。

在单项棍子目录下成立manifest副本,去除如下可用:

激活

{

"name": "Blogger"

"short_name": "Blogger"

"start_url": "/",

"display": "standalone",

"background_color": "#0e9c95",

"theme_color": "#16a0d6e7",

"orientation": "portrait",

"icons": []

}

在我们的名册中的,我们判别了详见列出可用:

name:这判别了软件界面的辨识命名。 short_name:这判别了装有时将在软件界面标识下辨识的命名。 start_url:这告诉HTML软件界面的棍子 URL。 display:这告诉HTML如何辨识软件界面。 background_color: 这判别了装有时软件界面的背景颜色。 theme_color: 这判别了状态栏的颜色。 顺时针: 这判别了在应当用辨识在此期间常用的顺时针。 标识: 这判别了不同形状的标识或图像用作我们的软件界面正页标识。

手动成立我们的正萤幕标识意味著是一项非常复杂的任务,但不用担心。我们将利用取名为pwa-asset-generator的第三方应用程序,常用详见列出擅自从公共目录中的的正软件界面标识生成不同形状的标识:

激活

#change directory to the public folder

cd public

#generate icons

npx pwa-asset-generator logo.png icons

上面的擅自将在 public 可用副本中的成立一个标识 可用副本,其中的构成我们软件界面的许多标识,以及终后端上的一些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 编译器,您的HTML在前台运转在一个基本上的线程中的,以处理您为今后的请求留有的存款和图详见的磁盘,从而为您的软件界面启用FTP支持。

所以在public 可用副本中的成立一个blogger.serviceWorker.js 副本。对于 service worker,有很多血案(push、activate、install、fetch、message、sync),但对于本讲义的演示,我们将简介install、activate 和fetch 血案。在此之后,我们所需成立一个运算符来打印我们在软件界面中的常用的所有存款。

激活

const assets = [

"/",

"css/style.css",

"js/app.js",

"/images/blog1.jpg",

"/images/blog2.jpg",

"/images/blog3.jpg,"

];

然后,我们将NSAinstall 血案来登记注册并将我们的静态副本留有到HTML的磁盘中的。此过程所需一些时间才能完成。要跳过下次,我们将常用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工具。此工具下次操作者完成,然后在写入之后检查我们尝试移除的存款是否是我们近期软件界面的存款。

在此之后,我们所需打印在磁盘中的的副本才能常用它们。

激活

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工具,我们覆盖HTML的默认值并让我们的血案赶回一个 Promise。磁盘完成后,我们可以赶回evt.request对应当的磁盘。当磁盘事先后,我们可以赶回匹配 evt.request 的磁盘。

我们不太意味著事与愿违设为了我们的 service worker。从前让我们让它在我们的软件界面中的可用。

登记注册 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));

});

}

在这里,我们检查我们的软件界面的HTML是否支持Service Worker(当然不是所有的HTML都支持Service Worker),然后登记注册我们的Service Worker 副本。

从前常用详见列出擅自运转软件界面:

激活

npm start

在HTML中的转到 localhost:8000 以访问该软件界面。

Google航标检查

从前让我们检查一下我们是否常用Google Lighthouse检查应该设为了 PWA 。右键默认HTML并选取“检查”。在检查选项卡上,选取航标并默认生成报告。如果您的软件界面一切顺利,您应当该会看着如下萤幕截图中的的编码器:

我们不太意味著事与愿违地成立了我们的第一个软件界面。你还可以停止增值器以在FTP模式下检测软件界面。

结论

渐进式 Web 应当用 (PWA) 常用近代 API 通过单个编译器库发放提高的功能性、安全性和可装有性。它们允许您的最终软件常用您的软件界面,无论他们是否有在线连接上来。您应当该随时 fork打印库并向单项去除其他功能性。

原意标题:Building Offline-First Apps With Node.js and SQLite

原意作者:Clara Ekekenta

武汉哪个医院看妇科看的好
郑州看白癜风哪里最好
祛湿小妙招
成都医院排名
长沙牛皮癣专科医院
相关阅读
友情链接