📝 Added sandbox (code sketchbook)
This commit is contained in:
parent
b475595f7f
commit
b5daf18b1a
142 changed files with 100702 additions and 0 deletions
3
sandbox/vue_sse/.vscode/extensions.json
vendored
Normal file
3
sandbox/vue_sse/.vscode/extensions.json
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"recommendations": ["Vue.volar", "Vue.vscode-typescript-vue-plugin"]
|
||||
}
|
||||
20
sandbox/vue_sse/vue_sse_back/README.md
Normal file
20
sandbox/vue_sse/vue_sse_back/README.md
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
### A Very Basic Set Up for Server Side Events Using Node/ExpressJS
|
||||
|
||||
This very basic project is a set up to scaffold a working backend in
|
||||
Node/ExpressJS for server side events.
|
||||
|
||||
It is a small adjustment to [Hussein Nasser's youtube video on the topic](https://www.youtube.com/watch?v=4HlNv1qpZFY).
|
||||
|
||||
__Installing and Getting Started__
|
||||
```
|
||||
git clone <this_repo_url>
|
||||
```
|
||||
```
|
||||
cd <this_repo_name>
|
||||
```
|
||||
```
|
||||
npm install
|
||||
```
|
||||
```
|
||||
npm run start
|
||||
```
|
||||
44
sandbox/vue_sse/vue_sse_back/index.js
Normal file
44
sandbox/vue_sse/vue_sse_back/index.js
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
const express = require('express')
|
||||
const route = express.Router()
|
||||
const app = express()
|
||||
// const bodyParser = require('body-parser')
|
||||
const path = require('path')
|
||||
const cors = require('cors')
|
||||
|
||||
// middleware
|
||||
app.use(
|
||||
cors({
|
||||
origin: true,
|
||||
credentials: true,
|
||||
}),
|
||||
)
|
||||
// app.use(bodyParser.urlencoded({ extended: false }))
|
||||
// app.use(express.static(path.join(__dirname, 'public')))
|
||||
// may not be necessary...
|
||||
// app.use(express.json())
|
||||
|
||||
// routes
|
||||
// route.get('/', (req, res) =>
|
||||
// res.sendFile(__dirname + '/index.html'))
|
||||
|
||||
app.get('/stream', (req, res) => {
|
||||
console.log('Client Connected')
|
||||
res.setHeader('Content-Type', 'text/event-stream')
|
||||
// res.setHeader('Access-Control-Allow-Origin', '*')
|
||||
let i = 0
|
||||
const intervalId = setInterval(() => {
|
||||
// const date = new Date().toLocaleString()
|
||||
// res.write(`data: ${date}\n\n`)
|
||||
res.write(`data: hello: ${i++}\n\n`)
|
||||
}, 1000)
|
||||
|
||||
res.on('close', () => {
|
||||
console.log('Client closed connection')
|
||||
clearInterval(intervalId)
|
||||
res.end()
|
||||
})
|
||||
// send(res)
|
||||
})
|
||||
|
||||
// server
|
||||
app.listen(8080, () => console.log('listening on 8080'))
|
||||
1693
sandbox/vue_sse/vue_sse_back/package-lock.json
generated
Normal file
1693
sandbox/vue_sse/vue_sse_back/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
18
sandbox/vue_sse/vue_sse_back/package.json
Normal file
18
sandbox/vue_sse/vue_sse_back/package.json
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"name": "node_sse",
|
||||
"version": "1.0.0",
|
||||
"description": "small sse for educational purposes",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"start": "nodemon index.js"
|
||||
},
|
||||
"author": "tomit4",
|
||||
"license": "BSD-3-Clause",
|
||||
"dependencies": {
|
||||
"cors": "^2.8.5",
|
||||
"express": "^4.18.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"nodemon": "^2.0.22"
|
||||
}
|
||||
}
|
||||
6
sandbox/vue_sse/vue_sse_front/.prettierrc
Normal file
6
sandbox/vue_sse/vue_sse_front/.prettierrc
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
trailingComma: "all"
|
||||
tabWidth: 4
|
||||
semi: false
|
||||
singleQuote: true
|
||||
bracketSpacing: true
|
||||
arrowParens: "avoid"
|
||||
7
sandbox/vue_sse/vue_sse_front/README.md
Normal file
7
sandbox/vue_sse/vue_sse_front/README.md
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
# Vue 3 + Vite
|
||||
|
||||
This template should help get you started developing with Vue 3 in Vite. The template uses Vue 3 `<script setup>` SFCs, check out the [script setup docs](https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup) to learn more.
|
||||
|
||||
## Recommended IDE Setup
|
||||
|
||||
- [VS Code](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur) + [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin).
|
||||
13
sandbox/vue_sse/vue_sse_front/index.html
Normal file
13
sandbox/vue_sse/vue_sse_front/index.html
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Vite + Vue</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
<script type="module" src="/src/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
1213
sandbox/vue_sse/vue_sse_front/package-lock.json
generated
Normal file
1213
sandbox/vue_sse/vue_sse_front/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
18
sandbox/vue_sse/vue_sse_front/package.json
Normal file
18
sandbox/vue_sse/vue_sse_front/package.json
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"name": "vue_sse",
|
||||
"private": true,
|
||||
"version": "0.0.0",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
"build": "vite build",
|
||||
"preview": "vite preview"
|
||||
},
|
||||
"dependencies": {
|
||||
"vue": "^3.2.47"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@vitejs/plugin-vue": "^4.1.0",
|
||||
"vite": "^4.2.0"
|
||||
}
|
||||
}
|
||||
14
sandbox/vue_sse/vue_sse_front/public/index.html
Normal file
14
sandbox/vue_sse/vue_sse_front/public/index.html
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title></title>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link href="css/style.css" rel="stylesheet">
|
||||
</head>
|
||||
<body>
|
||||
<h1>Hello World!</h1>
|
||||
<ul class="stream-section"></ul>
|
||||
<script src="index.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
11
sandbox/vue_sse/vue_sse_front/public/index.js
Normal file
11
sandbox/vue_sse/vue_sse_front/public/index.js
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
const sse = new EventSource("http://localhost:8080/stream")
|
||||
const streamSection = document.querySelector('.stream-section')
|
||||
|
||||
sse.onmessage = (e) => {
|
||||
const node = document.createElement('li')
|
||||
node.textContent = e.data
|
||||
streamSection.appendChild(node)
|
||||
}
|
||||
|
||||
// stops stream after 30 seconds
|
||||
setTimeout(() => sse.close(), 30000)
|
||||
22
sandbox/vue_sse/vue_sse_front/src/App.vue
Normal file
22
sandbox/vue_sse/vue_sse_front/src/App.vue
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
<script setup>
|
||||
import HelloWorld from './components/HelloWorld.vue'
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<HelloWorld msg="Hello World!" />
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.logo {
|
||||
height: 6em;
|
||||
padding: 1.5em;
|
||||
will-change: filter;
|
||||
transition: filter 300ms;
|
||||
}
|
||||
.logo:hover {
|
||||
filter: drop-shadow(0 0 2em #646cffaa);
|
||||
}
|
||||
.logo.vue:hover {
|
||||
filter: drop-shadow(0 0 2em #42b883aa);
|
||||
}
|
||||
</style>
|
||||
1
sandbox/vue_sse/vue_sse_front/src/assets/vue.svg
Normal file
1
sandbox/vue_sse/vue_sse_front/src/assets/vue.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="37.07" height="36" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 198"><path fill="#41B883" d="M204.8 0H256L128 220.8L0 0h97.92L128 51.2L157.44 0h47.36Z"></path><path fill="#41B883" d="m0 0l128 220.8L256 0h-51.2L128 132.48L50.56 0H0Z"></path><path fill="#35495E" d="M50.56 0L128 133.12L204.8 0h-47.36L128 51.2L97.92 0H50.56Z"></path></svg>
|
||||
|
After Width: | Height: | Size: 496 B |
33
sandbox/vue_sse/vue_sse_front/src/components/HelloWorld.vue
Normal file
33
sandbox/vue_sse/vue_sse_front/src/components/HelloWorld.vue
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
<script>
|
||||
import { ref } from 'vue'
|
||||
export default {
|
||||
props: {
|
||||
msg: String,
|
||||
},
|
||||
computed: {
|
||||
nodes() {
|
||||
const sse = new EventSource('http://localhost:8080/stream')
|
||||
const nodes = ref([])
|
||||
sse.onmessage = e => {
|
||||
console.log('e :=>', e)
|
||||
const node = e.data
|
||||
nodes.value.push(node)
|
||||
}
|
||||
setTimeout(() => sse.close(), 30000)
|
||||
return nodes
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
<template>
|
||||
<h2>{{ msg }}</h2>
|
||||
<ul class="stream" v-for="node in nodes.value">
|
||||
<li>{{ node }}</li>
|
||||
</ul>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.stream {
|
||||
list-style: none;
|
||||
}
|
||||
</style>
|
||||
5
sandbox/vue_sse/vue_sse_front/src/main.js
Normal file
5
sandbox/vue_sse/vue_sse_front/src/main.js
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
import { createApp } from 'vue'
|
||||
import './style.css'
|
||||
import App from './App.vue'
|
||||
|
||||
createApp(App).mount('#app')
|
||||
89
sandbox/vue_sse/vue_sse_front/src/style.css
Normal file
89
sandbox/vue_sse/vue_sse_front/src/style.css
Normal file
|
|
@ -0,0 +1,89 @@
|
|||
:root {
|
||||
font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
|
||||
line-height: 1.5;
|
||||
font-weight: 400;
|
||||
|
||||
color-scheme: light dark;
|
||||
color: rgba(255, 255, 255, 0.87);
|
||||
background-color: #242424;
|
||||
|
||||
font-synthesis: none;
|
||||
text-rendering: optimizeLegibility;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
-webkit-text-size-adjust: 100%;
|
||||
}
|
||||
|
||||
a {
|
||||
font-weight: 500;
|
||||
color: #646cff;
|
||||
text-decoration: inherit;
|
||||
}
|
||||
a:hover {
|
||||
color: #535bf2;
|
||||
}
|
||||
|
||||
a {
|
||||
font-weight: 500;
|
||||
color: #646cff;
|
||||
text-decoration: inherit;
|
||||
}
|
||||
a:hover {
|
||||
color: #535bf2;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
display: flex;
|
||||
place-items: center;
|
||||
min-width: 320px;
|
||||
min-height: 100vh;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 3.2em;
|
||||
line-height: 1.1;
|
||||
}
|
||||
|
||||
button {
|
||||
border-radius: 8px;
|
||||
border: 1px solid transparent;
|
||||
padding: 0.6em 1.2em;
|
||||
font-size: 1em;
|
||||
font-weight: 500;
|
||||
font-family: inherit;
|
||||
background-color: #1a1a1a;
|
||||
cursor: pointer;
|
||||
transition: border-color 0.25s;
|
||||
}
|
||||
button:hover {
|
||||
border-color: #646cff;
|
||||
}
|
||||
button:focus,
|
||||
button:focus-visible {
|
||||
outline: 4px auto -webkit-focus-ring-color;
|
||||
}
|
||||
|
||||
.card {
|
||||
padding: 2em;
|
||||
}
|
||||
|
||||
#app {
|
||||
max-width: 1280px;
|
||||
margin: 0 auto;
|
||||
padding: 2rem;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: light) {
|
||||
:root {
|
||||
color: #213547;
|
||||
background-color: #ffffff;
|
||||
}
|
||||
a:hover {
|
||||
color: #747bff;
|
||||
}
|
||||
button {
|
||||
background-color: #f9f9f9;
|
||||
}
|
||||
}
|
||||
7
sandbox/vue_sse/vue_sse_front/vite.config.js
Normal file
7
sandbox/vue_sse/vue_sse_front/vite.config.js
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
import { defineConfig } from 'vite'
|
||||
import vue from '@vitejs/plugin-vue'
|
||||
|
||||
// https://vitejs.dev/config/
|
||||
export default defineConfig({
|
||||
plugins: [vue()],
|
||||
})
|
||||
Loading…
Add table
Add a link
Reference in a new issue