我开发了 7 次同一款应用!哪个 JS 框架最好?
大家好,我是 John,一家多创企业建设者。
我热爱编程和市场营销。
点击此处查看我的所有 20 款产品
→ johnrush.me
→我的简历
→在 Twitter 上跟我打招呼
→试用我的网站建设器
警告:本文包含大量代码、幽默和足以改变人生的启示。请自行承担风险。😎
当人们问我最喜欢哪个前端框架时,我通常会回答“所有”。但最近,我决定测试一下这个说法,用七种不同的前端框架来构建同一个应用程序。
我将使用以下方法构建一个简单的待办事项应用程序 6 次:
- 角度
- 反应
- Vue.js
- 苗条
- 榆树
- AlpineJS
- 火星X
1:初恋:Angular🔥
Angular 已经存在一段时间了,以强大而又固执己见而闻名(感谢谷歌)。它催生了组件和依赖注入等概念,并用双向数据绑定震撼了我们的世界。它是我第一个爱上的前端框架。我尝试过 Knockout 和其他几个框架,但都不太喜欢。但 AngularJS 赢得了我的心。
ng new todo-app --routing=false --style=css
里面app.component.ts
:
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
template: `
<h1>To-Do App</h1>
<ul>
<li *ngFor="let todo of todos">{{todo}}</li>
</ul>
<form (submit)="addTodo()">
<input [(ngModel)]="newTodo" name="newTodo">
<button type="submit">Add</button>
</form>`,
})
export class AppComponent {
todos = [];
newTodo = '';
addTodo() {
this.todos.push(this.newTodo);
this.newTodo = '';
}
}
不要忘记导入并包含 FormsModule app.module.ts
。
2:React。主流。⚛️
React 是 Facebook 送给我们开发人员的礼物🎁,我们厌倦了每次数据模型发生变化时手动更新 DOM 元素(原始 JS 中的哭泣),或者一旦 angularjs 应用程序获得太多数据或不断刷新循环,我们的浏览器就会冻结。
npx create-react-app todo-app
里面App.js
:
import React, { useState } from 'react';
function App() {
const [todos, setTodos] = useState([]);
const [newTodo, setNewToDo] = useState('');
const addTodo = e => {
e.preventDefault();
setTodos([...todos, newTodo]);
setNewToDo('');
};
return (
<div className="App">
<h1>To-Do App</h1>
<ul>{todos.map(todo => (<li key={todo}>{todo}</li>))}</ul>
<form onSubmit={add_todo}>
<input value={new_todo} onChange={(e) => set_new_todo(e.target.value)} />
submit_button
</form>
</div>
);
}
export default App;
3:我的第二任妻子:Vue.js💚
Vue.js 就像一个很酷的孩子一样进入了我们的生活,它希望让我们开发人员的工作变得更简单,同时让 Angular 和 React 也为之疯狂。
vue create todo-app
里面App.vue
:
<template>
<div id="app">
<h1>To-Do App</h1>
<ul>
<li v-for="(todo, index) in todos" :key="index">{{todo}}</li>
</ul>
<form @submit.prevent="addTodo">
<input v-model="newTodo"/>
<button type="submit">Add</button>
</form>
</div>
</template>
<script>
export default {
data() {
return {
todos: [],
newTodo: '',
};
},
methods: {
addTodo() {
this.todos.push(this.newTodo);
this.newTodo = '';
},
},
};
</script>
自从 VUE 推出了 Composition API 之后,我就对它失去了兴趣。对不起,VUE。
4:精简至极
Svelte 姗姗来迟,但值得等待!这个框架承诺了与众不同的东西——没有虚拟 DOM!(我知道他们最近通过添加几乎相同的功能变成了 React,但我不用那些功能,我仍然在用老版本的 Svelte)。
npx degit sveltejs/template todo-app
里面App.svelte
:
<script>
let todos = [];
let newTodo = '';
function add_todo(e) {
e.preventDefault();
todos = [...todos, new_todo];
new_todo= '';
}
</script>
<main>
<h1>To-Do App</h1>
<ul>{#each todos as todo}<li>{todo}</li>{/each}</ul>
<form on_submit|prevent_default={add_todo}>
<input bind:value={new_todo} />
<button type="submit">Add</button>
</form>
</main>
<style>
/* Add your styles here */
</style>
5:Elm-inator🌳
Elm 作为一门基于 Haskell 的纯函数式语言走进了我们的旅程,它提供“无运行时异常”(提示天使音乐)。
里面src/Main.elm
:
module Main exposing (..)
import Browser
import Html exposing (Html, button, div, form, h1, input, li, text, ul)
import Html.Attributes exposing (value)
import Html.Events exposing (onInput, onSubmit)
-- MODEL
type alias Model =
{ todos : List String
, newTodo : String
}
init : Model
init =
{ todos = []
, newTodo = ""
}
-- MESSAGES
type Msg
= AddTodo
| SetNewTodo String
-- UPDATE
update : Msg -> Model -> Model
update msg model =
case msg of
AddTodo ->
{ model | todos = model.todos ++ [model.newTodo], newTodo = "" }
SetNewTodo newTodo ->
{ model | newTodo = newTodo }
-- VIEW
view : Model -> Html Msg
view model =
div []
[ h1 [] [text "To-Do App"]
, ul [] (List.map (\todo -> li [] [text todo]) model.todos)
, form [onSubmit AddTodo]
[ input [value model.newTodo, onInput SetNewTodo] []
, button [] [text "Add"]
]
]
-- MAIN
main : Program () Model Msg
main =
Browser.sandbox
{ init = init
, update = update
, view = view
}
尽管 Elm 需要一些时间来适应,但它的类型系统和模式匹配帮助我们构建了强大的组件以及 Elm 架构 (TEA),确保即使复杂性增加,一切仍然井然有序。
6:Alpine,最被低估的一个。
<html>
<head>
<script src="https://cdn.jsdelivr.net/npm/alpinejs@3/dist/alpine.min.js" defer></script>
</head>
<body>
<div x-data="todoApp()" class="todo-container">
<h1>To-Do App</h1>
<form @submit.prevent="addTodo">
<input type="text" x-model="newTodo" placeholder="Add new todo">
<button type="submit">Add</button>
</form>
<ul>
<template x-for="todo in todos" :key="todo">
<li x-text="todo"></li>
</template>
</ul>
</div>
<script>
function todoApp() {
return {
newTodo: '',
todos: [],
addTodo() {
if (this.newTodo.trim() === '') {
return;
}
this.todos.push(this.newTodo);
this.newTodo = '';
}
}
}
</script>
</body>
</html>
7:MarsX - 在这里编写待办事项列表所花的时间比编写这句话所花的时间还少 :D
免责声明,我是 marsx 的作者,所以请随意忽略这一点,但我想说这并不坏。
<schema>
<array name="todo">
<object>
<string name="title" />
</object>
</array>
</schema>
现在你已经见证了我如何使用不同的前端框架构建同一个应用,你可能会想知道哪一个是最好的。好吧,我的朋友,这就像让父母挑选他们最喜欢的孩子一样——根本行不通。
每个框架都有其优缺点;对我有用的未必适合你。所以,大胆选择,开始构建精彩的应用吧!🚀
请记住:无论你选择哪个框架,都不要忘记享受编码的乐趣!😄
鏂囩珷鏉ユ簮锛�https://dev.to/johnrushx/i-built-the-same-app-7-times-which-js-framework-is-best-39e0大家好,我是 John,一家多创企业建设者。
我热爱编程和市场营销。
点击此处查看我的所有 20 款产品
→ johnrush.me
→我的简历
→在 Twitter 上跟我打招呼
→试用我的网站建设器