g
This commit is contained in:
commit
eecc704fee
8 changed files with 354 additions and 0 deletions
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
/dist
|
||||||
|
*.pdf
|
||||||
|
*.pdfpc
|
5
index.html
Normal file
5
index.html
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<div id="app"></div>
|
||||||
|
<script src="./index.jsx" type="module"></script>
|
||||||
|
</html>
|
21
index.jsx
Normal file
21
index.jsx
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
import React, { renderDom, useState } from "./react";
|
||||||
|
|
||||||
|
/** @jsx React.createElement */
|
||||||
|
function App() {
|
||||||
|
const [value, setValue] = useState();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<p>Counter value: {value}</p>
|
||||||
|
<button onClick={() => setValue((i) => i + 1)}>Increment</button>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
renderDom(
|
||||||
|
document.getElementById("app"),
|
||||||
|
<>
|
||||||
|
<App />
|
||||||
|
<App />
|
||||||
|
</>
|
||||||
|
);
|
117
notes.md
Normal file
117
notes.md
Normal file
|
@ -0,0 +1,117 @@
|
||||||
|
# WWW
|
||||||
|
|
||||||
|
- Didn't really have much put together but still wanted to do a talk, so here we are.
|
||||||
|
|
||||||
|
# Who am I
|
||||||
|
|
||||||
|
- Former webmaster
|
||||||
|
- I made the current ACM website!
|
||||||
|
- Discuss Drupal?
|
||||||
|
- Programming languages
|
||||||
|
- Hate every language
|
||||||
|
- 4 years industry
|
||||||
|
- 10+ years complaining
|
||||||
|
- Javascript was my first language, so soft spot in my heart
|
||||||
|
- I have seen many things come and go (lead into next slide)
|
||||||
|
|
||||||
|
# History
|
||||||
|
|
||||||
|
- Was gonna put subjective history, but all history is subjective
|
||||||
|
- These are all things that at some point I believe "took the web by storm"
|
||||||
|
|
||||||
|
- HTML
|
||||||
|
- I mean, this is the platform, so I have to put this here
|
||||||
|
- Styling done via attributes
|
||||||
|
- Frames / tables for layout
|
||||||
|
- Javascript
|
||||||
|
- Rather unglamorous
|
||||||
|
- CSS
|
||||||
|
- Don't know much, let's gloss over it
|
||||||
|
- Flash
|
||||||
|
- Super easy to make and publish things
|
||||||
|
- jQuery
|
||||||
|
- One of the longest lasting web frameworks
|
||||||
|
- Coffeescript
|
||||||
|
- Introduced a lot of funny little syntax
|
||||||
|
- Transpiling wasn't new, but warmed a lot of people up to the idea of transpiling
|
||||||
|
- Used by a lot of big projects and companies
|
||||||
|
- Benefits not really helpful anymore since they got added to ES6
|
||||||
|
- Angular
|
||||||
|
- ES6
|
||||||
|
- fetch
|
||||||
|
- spread operator
|
||||||
|
- arrow functions
|
||||||
|
|
||||||
|
This is where my list ends, but still lots of new and interesting Javascript projects today.
|
||||||
|
|
||||||
|
# Things we fixed
|
||||||
|
|
||||||
|
- Scoping
|
||||||
|
- Var/Let
|
||||||
|
- Arrow functions
|
||||||
|
- Eliminated `this`
|
||||||
|
- Modules
|
||||||
|
- Massively improved analyzability + tree-shaking
|
||||||
|
- STDLIB
|
||||||
|
- Map/Set/Symbol/etc
|
||||||
|
- toSorted/map/filter/reduce
|
||||||
|
- Observers
|
||||||
|
- bigints
|
||||||
|
|
||||||
|
# Good things
|
||||||
|
|
||||||
|
- Bundling
|
||||||
|
- This is basically just preprocessors
|
||||||
|
- Other languages should have this
|
||||||
|
- HMR
|
||||||
|
- Incredibly useful and versatile
|
||||||
|
- `watchexec`
|
||||||
|
- SSR
|
||||||
|
- Solved the problem of not being able to render immediately
|
||||||
|
- Good for static site generators like Astro
|
||||||
|
- X-plat UI
|
||||||
|
- Electron/Tauri
|
||||||
|
- Lot of people could develop really fast
|
||||||
|
- Compare to Qt
|
||||||
|
- Don't play the "familiarity" card
|
||||||
|
|
||||||
|
# Reactivity
|
||||||
|
|
||||||
|
- Flux
|
||||||
|
- Single point of update
|
||||||
|
- Redux
|
||||||
|
-
|
||||||
|
- Signals
|
||||||
|
- Enables better reactivity
|
||||||
|
- Note on Svelte+friends: they talk about compiling but it seems a lot of their compiled code isn't really that much more concise, large runtime
|
||||||
|
|
||||||
|
Which brings me to my controversial take:
|
||||||
|
|
||||||
|
# Web is a solid choice
|
||||||
|
|
||||||
|
- "Small" software as we know it today pretty much doesn't really exist, given the complexity of hardware and needs of users
|
||||||
|
- We have optimized for "having nice things" a lot, and there's no point in taking it
|
||||||
|
|
||||||
|
# Bad
|
||||||
|
|
||||||
|
- Equality
|
||||||
|
- Truthy /falsy
|
||||||
|
- `==` still in the language, typescript doesn't really fix this
|
||||||
|
- Macros
|
||||||
|
- JS was supposed to be a Lisp
|
||||||
|
- No nice features from homoiconicity
|
||||||
|
- Runtime
|
||||||
|
- Privacy discussion
|
||||||
|
- Ecosystem
|
||||||
|
- NPM sucks
|
||||||
|
- Lots of packages for small simple things
|
||||||
|
- Supply chain attacks
|
||||||
|
- Security of running npm software on ur own computer, possibly an OS problem instead
|
||||||
|
- Lack of competition in browsers
|
||||||
|
- WEI / FLOC / google mess
|
||||||
|
|
||||||
|
# What's next?
|
||||||
|
|
||||||
|
- HTMX
|
||||||
|
- CCSS
|
||||||
|
- Declarative web framework
|
51
presentation.typ
Normal file
51
presentation.typ
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
#import "@preview/polylux:0.3.1": *
|
||||||
|
|
||||||
|
#set page(paper: "presentation-16-9")
|
||||||
|
#set text(size: 25pt)
|
||||||
|
|
||||||
|
#polylux-slide[
|
||||||
|
#align(horizon + center)[
|
||||||
|
= Compile-Time Programming
|
||||||
|
|
||||||
|
Michael Zhang
|
||||||
|
|
||||||
|
#datetime.today().display("[month repr:long] [day], [year]")
|
||||||
|
]
|
||||||
|
]
|
||||||
|
|
||||||
|
#polylux-slide[
|
||||||
|
== What is compile time?
|
||||||
|
|
||||||
|
#table(
|
||||||
|
columns: (auto, auto),
|
||||||
|
stroke: none,
|
||||||
|
gutter: 35pt,
|
||||||
|
|
||||||
|
```c
|
||||||
|
int doTheFunny(int n) {
|
||||||
|
int result = 0;
|
||||||
|
for (int i = 0; i < n; i++) {
|
||||||
|
result += i;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
return doTheFunny(21);
|
||||||
|
}
|
||||||
|
```,
|
||||||
|
|
||||||
|
[
|
||||||
|
#pause
|
||||||
|
```
|
||||||
|
main:
|
||||||
|
mov eax, 210
|
||||||
|
ret
|
||||||
|
```
|
||||||
|
]
|
||||||
|
)
|
||||||
|
]
|
||||||
|
|
||||||
|
#polylux-slide[
|
||||||
|
|
||||||
|
]
|
102
presentation2.typ
Normal file
102
presentation2.typ
Normal file
|
@ -0,0 +1,102 @@
|
||||||
|
#import "@preview/polylux:0.3.1": *
|
||||||
|
#import themes.simple: *
|
||||||
|
#show: simple-theme
|
||||||
|
|
||||||
|
#title-slide[
|
||||||
|
= WWW
|
||||||
|
|
||||||
|
Compendium of interesting web dev + Javascript factoids
|
||||||
|
|
||||||
|
Michael Zhang
|
||||||
|
]
|
||||||
|
|
||||||
|
#slide[
|
||||||
|
== Who am I #pause
|
||||||
|
|
||||||
|
- Former webmaster
|
||||||
|
- Programming languages
|
||||||
|
- 4 years of industry experience
|
||||||
|
- 10+ years of experience complaining about Javascript
|
||||||
|
]
|
||||||
|
|
||||||
|
#slide[
|
||||||
|
== History
|
||||||
|
|
||||||
|
#columns(2)[
|
||||||
|
- HTML (1991)
|
||||||
|
- Javascript (1995)
|
||||||
|
- CSS (1996)
|
||||||
|
- Flash (1995)
|
||||||
|
- JSON (2001)
|
||||||
|
- jQuery (2006)
|
||||||
|
- HTML 5 (2008)
|
||||||
|
- Node.js (2009)
|
||||||
|
- CoffeeScript (2009)
|
||||||
|
- Angular (2010)
|
||||||
|
- Typescript (2012)
|
||||||
|
- asm.js (2013)
|
||||||
|
- Webpack (2014)
|
||||||
|
- Babel (2014)
|
||||||
|
- Atom Shell (Electron) (2015)
|
||||||
|
- ECMAScript 6 (2015)
|
||||||
|
- React (2015)
|
||||||
|
]
|
||||||
|
]
|
||||||
|
|
||||||
|
#slide[
|
||||||
|
== Things we fixed
|
||||||
|
|
||||||
|
#columns(2)[
|
||||||
|
- JS features
|
||||||
|
- Scoping
|
||||||
|
- Arrow functions
|
||||||
|
- Modules
|
||||||
|
- Standard library
|
||||||
|
- Layout
|
||||||
|
- Flex
|
||||||
|
- Selectors
|
||||||
|
]
|
||||||
|
]
|
||||||
|
|
||||||
|
#slide[
|
||||||
|
== Good things
|
||||||
|
|
||||||
|
- Bundling
|
||||||
|
- HMR
|
||||||
|
- SSR + Hydration
|
||||||
|
- Cross-platform UI
|
||||||
|
- Reactivity...
|
||||||
|
]
|
||||||
|
|
||||||
|
#slide[
|
||||||
|
== Let's talk about reactivity
|
||||||
|
|
||||||
|
- Flux architecture vs. MVC vs. FRP
|
||||||
|
- Signal-based state management
|
||||||
|
]
|
||||||
|
|
||||||
|
#focus-slide[
|
||||||
|
== Web is a solid choice for UI
|
||||||
|
]
|
||||||
|
|
||||||
|
#slide[
|
||||||
|
== Bad
|
||||||
|
|
||||||
|
- JS Language
|
||||||
|
- Equality still sucks
|
||||||
|
- Prototypes still suck
|
||||||
|
- No macros
|
||||||
|
- Runtime
|
||||||
|
- Fingerprinting
|
||||||
|
- Ecosystem
|
||||||
|
- Bloat
|
||||||
|
- Lack of competition in browsers
|
||||||
|
]
|
||||||
|
|
||||||
|
#slide[
|
||||||
|
== What's next?
|
||||||
|
|
||||||
|
- HTMX?
|
||||||
|
- CCSS?
|
||||||
|
- Fully declarative web framework?
|
||||||
|
]
|
46
react.js
vendored
Normal file
46
react.js
vendored
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
let id = 1;
|
||||||
|
function createElement(type, props, ...children) {
|
||||||
|
const struct = {
|
||||||
|
id,
|
||||||
|
type,
|
||||||
|
props,
|
||||||
|
children: children.map((child) =>
|
||||||
|
typeof child === "object" ? child : { type: TEXT_NODE }
|
||||||
|
),
|
||||||
|
};
|
||||||
|
id += 1;
|
||||||
|
return struct;
|
||||||
|
}
|
||||||
|
|
||||||
|
function intoDom(virtEl) {
|
||||||
|
if (!virtEl) return null;
|
||||||
|
if (typeof virtEl === "string") return document.createTextNode(virtEl);
|
||||||
|
|
||||||
|
console.log("vi", virtEl);
|
||||||
|
if (typeof virtEl.type === "function") {
|
||||||
|
return intoDom(virtEl.type());
|
||||||
|
}
|
||||||
|
|
||||||
|
const el = virtEl.type
|
||||||
|
? document.createElement(virtEl.type)
|
||||||
|
: document.createDocumentFragment();
|
||||||
|
for (const c of virtEl.children ?? []) {
|
||||||
|
const domC = intoDom(c);
|
||||||
|
if (domC) el.appendChild(domC);
|
||||||
|
}
|
||||||
|
return el;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function renderDom(domEl, virtEl) {
|
||||||
|
domEl.appendChild(intoDom(virtEl));
|
||||||
|
}
|
||||||
|
|
||||||
|
export function useState() {
|
||||||
|
let value;
|
||||||
|
const setter = (newValue) => {
|
||||||
|
value = newValue;
|
||||||
|
};
|
||||||
|
return [value, setter];
|
||||||
|
}
|
||||||
|
|
||||||
|
export default { createElement };
|
9
vite.config.ts
Normal file
9
vite.config.ts
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
import { defineConfig } from "vite";
|
||||||
|
|
||||||
|
export default defineConfig({
|
||||||
|
build: {
|
||||||
|
modulePreload: {
|
||||||
|
polyfill: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
Loading…
Reference in a new issue