HTML是用來開發(fā)網(wǎng)頁的,它是開發(fā)網(wǎng)頁的語言
全稱HyperText Mark-up Language,超文本標(biāo)記語言
標(biāo)記就是標(biāo)簽
<標(biāo)簽名稱></標(biāo)簽名稱> 比如 <html></html> <h1></h1>等,標(biāo)簽大多數(shù)都是成對(duì)出現(xiàn)的。
超文本 兩層含義:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>網(wǎng)頁標(biāo)題</title>
</head>
<body>
網(wǎng)頁顯示內(nèi)容
</body>
</html>
第一行<!DOCTYPE html>是文檔聲明
用來指定頁面所使用的html的版本, 這里聲明的是一個(gè)html5的文檔
<html>...</html>標(biāo)簽是開發(fā)人員在告訴瀏覽器
整個(gè)網(wǎng)頁是從<html>這里開始的,到</html>結(jié)束
也就是html文檔的開始和結(jié)束標(biāo)簽
<head>...</head>標(biāo)簽用于定義文檔的頭部
是負(fù)責(zé)對(duì)網(wǎng)頁進(jìn)行設(shè)置標(biāo)題、編碼格式以及引入css和js文件的
<body>...</body>標(biāo)簽是編寫網(wǎng)頁上顯示的內(nèi)容
網(wǎng)頁文件的后綴是.html, 一個(gè)html文件就是一個(gè)網(wǎng)頁,html文件用編輯器打開顯示的是文本,可以用文本的方式編輯它,如果用瀏覽器打開,瀏覽器會(huì)按照標(biāo)簽描述內(nèi)容將文件渲染成網(wǎng)頁
VS Code全拼是 Visual Studio Code 是由微軟研發(fā)的一款免費(fèi)、開源的跨平臺(tái)代碼編輯器
目前是前端(網(wǎng)頁)開發(fā)使用最多的一款軟件開發(fā)工具
下載網(wǎng)址: https://code.visualstudio.com/Download
選擇對(duì)應(yīng)的安裝包進(jìn)行下載:
安裝一切默認(rèn)
1 標(biāo)簽不區(qū)分大小寫,但是推薦使用小寫
2 根據(jù)標(biāo)簽的書寫形式,標(biāo)簽分為雙標(biāo)簽(閉合標(biāo)簽)和單標(biāo)簽(空標(biāo)簽) 2.1 雙標(biāo)簽是指由開始標(biāo)簽和結(jié)束標(biāo)簽組成的一對(duì)標(biāo)簽,這種標(biāo)簽允許嵌套和承載內(nèi)容,比如: div標(biāo)簽 2.2 單標(biāo)簽是一個(gè)標(biāo)簽組成,沒有標(biāo)簽內(nèi)容, 比如: img標(biāo)簽
標(biāo)簽的使用形式
列表標(biāo)簽
網(wǎng)頁效果
表格標(biāo)簽
<table>標(biāo)簽:表示一個(gè)表格
<tr>標(biāo)簽:表示表格中的一行
<td>標(biāo)簽:表示表格中的列
<th>標(biāo)簽:表示表格中的表頭
屬性設(shè)置
border: 1px solid black:設(shè)置邊框和顏色
border-collapse: collapse:設(shè)置邊框合并
網(wǎng)頁效果
表單標(biāo)簽
表單用于搜集不同類型的用戶輸入的數(shù)據(jù),然后可以把用戶數(shù)據(jù)提交到web服務(wù)器
<form>標(biāo)簽 表示表單標(biāo)簽,定義整體的表單區(qū)域
一個(gè)表單中有很多信息組成,比如 姓名,愛好,地址等,這些內(nèi)容有很多其他標(biāo)簽來承載
這些標(biāo)簽稱為表單元素標(biāo)簽
網(wǎng)頁效果
表單用于搜集不同類型的用戶輸入的數(shù)據(jù),然后可以把用戶數(shù)據(jù)提交到web服務(wù)器
兩種方式的區(qū)別:
表單元素屬性設(shè)置
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<!--
姓名 type="text" 定義單行文本輸入框
密碼 type="password" 定義密碼輸入框
性別 type="radio" 定義單選框
愛好 type="checkbox" 定義復(fù)選框
照片 type="file" 定義上傳文件
個(gè)人描述 <textarea></textarea> 定義多行文本輸入框
地址 <select></select> 定義下拉列表
提交 type="submit" 定義提交按鈕
重置 type="reset" 定義重置按鈕
按鈕 type="button" 定義一個(gè)普通按鈕
-->
<form action="http://192.168.1.106:8080" method="POST">
<label>姓名:</label>
<input type="text" name="username" >
<br>
<label>密碼:</label>
<input type="password" name="password">
<br>
<label>性別:</label>
<input type="radio" name="sex" value="1">男
<input type="radio" name="sex" value="0">女
<br>
<label>愛好:</label>
<input type="checkbox" name="like" value="睡覺">睡覺
<input type="checkbox" name="like" value="吃飯">吃飯
<input type="checkbox" name="like" value="打豆豆">打豆豆
<br>
<label>照片:</label>
<input type="file" name="pic">
<br>
<label>個(gè)人描述:</label>
<textarea name="desc"></textarea>
<br>
<label>地址:</label>
<select name="addr">
<option value="1">北京</option>
<option value="2">上海</option>
<option value="3">廣州</option>
<option value="4">深圳</option>
</select>
<br>
<input type="submit" value="提交">
<input type="reset" value="重置">
<input type="button" value="按鈕">
</form>
</body>
</html>
點(diǎn)擊提交:
可以看到服務(wù)器收到了請(qǐng)求報(bào)文。
源:https://www.sitepoint.com/
現(xiàn)代應(yīng)用相比普通的網(wǎng)頁有不同的要求。但是瀏覽器是一個(gè)有著一套(大部分)固定可用的技術(shù)的平臺(tái),JavaScript依然是web應(yīng)用的核心語言;任何需要在瀏覽器上跑的應(yīng)用都需要使用這種語言。
我們都知道Javascript并不是最好的語言,特別是在復(fù)雜的應(yīng)用中,它可能不太能勝任。為了避免這種情況,一些新的語言或現(xiàn)有語言的編譯器被創(chuàng)造出來,你不用寫一行Javascript或者考慮這種語言的局限,就能生產(chǎn)在瀏覽器能運(yùn)行的代碼。
這篇文章包括了十種有趣的語言能夠編譯為Javascript,在瀏覽器或者Node.js中被執(zhí)行。
--ADVERTISEMENT--
Dart
Dart是一個(gè)典型的面向?qū)ο蟮恼Z言,任何東西都是一個(gè)對(duì)象并且任何對(duì)象都是一個(gè)類的實(shí)例(對(duì)象也可以表現(xiàn)為函數(shù))。它的特殊性用于打造面向?yàn)g覽器,服務(wù)器和移動(dòng)設(shè)備的應(yīng)用。它由谷歌來維護(hù),是用于驅(qū)動(dòng)下一代的AdWords UI。AdWords UI是谷歌盈利的重要產(chǎn)品,這也證明了它在體量上的強(qiáng)大。
這種語言可以編譯為JavaScript用于瀏覽器,或者直接通過Dart VM解釋,這樣也可以允許你構(gòu)建服務(wù)端應(yīng)用。移動(dòng)應(yīng)用可以通過Flutter SDK創(chuàng)建。
復(fù)雜的應(yīng)用還需要一系列特別為任務(wù)所設(shè)計(jì)的成熟的庫和語言特性,Dart這些都有。舉例來說一個(gè)流行的庫是AngularDart,一個(gè)Dart版本的Angular。
它允許你寫非侵入式的類型安全的代碼,但是這不是必須的,因?yàn)樗麄兛梢宰詣?dòng)檢測(cè)類型。它可以允許你快速構(gòu)建原型而不用過于思考細(xì)節(jié),一旦你需要的時(shí)候,你可以加入類型讓它更健壯。
至于在VM中的并發(fā)編程,相比與共享內(nèi)存線程(Dart是單線程的),Dart使用所謂的_Isolates_,有它自己的堆內(nèi)存,而交流是通過傳遞信息。在瀏覽器上,情況就有點(diǎn)不一樣了:相比與創(chuàng)建一個(gè)新的_isolates_,你創(chuàng)建一個(gè)新的_Workers_。
// Example extracted from dartlang.org
import 'dart:async';
import 'dart:math' show Random;
main() async {
print('Compute π using the Monte Carlo method.');
await for (var estimate in computePi()) {
print('π ? $estimate');
}
}
/// Generates a stream of increasingly accurate estimates of π.
Stream<double> computePi({int batch: 1000000}) async* {
var total = 0;
var count = 0;
while (true) {
var points = generateRandom().take(batch);
var inside = points.where((p) => p.isInsideUnitCircle);
total += batch;
count += inside.length;
var ratio = count / total;
// Area of a circle is A = π?r2, therefore π = A/r2.
// So, when given random points with x ∈ <0,1>,
// y ∈ <0,1>, the ratio of those inside a unit circle
// should approach π / 4\. Therefore, the value of π
// should be:
yield ratio * 4;
}
}
Iterable<Point> generateRandom([int seed]) sync* {
final random = new Random(seed);
while (true) {
yield new Point(random.nextDouble(), random.nextDouble());
}
}
class Point {
final double x, y;
const Point(this.x, this.y);
bool get isInsideUnitCircle => x * x + y * y <= 1;
}
Get started with Dart https://www.dartlang.org/guides/get-started
TypeScript
TypeScript 是Javascript的超集;一個(gè)有效的Javascript項(xiàng)目也是一個(gè)有效的TypeScript項(xiàng)目只是添加了靜態(tài)類型。編譯器也可以作為ES2015+到當(dāng)前實(shí)現(xiàn)的轉(zhuǎn)譯器,這樣你總是能得到最新的特性。
不同于其他語言,TypeScript保持了Javascript完整的精神,只是此外添加了增加代碼可靠性的功能。這些功能就是類型注釋和其他類型相關(guān)的功能,得益于專業(yè)工具像是靜態(tài)分析器和其他工具在重構(gòu)過程的加入,這些功能使寫Javascript更加有趣。并且,類型的加入改善了你的應(yīng)用不同組件之間的接口。
類型診斷是支持性的,你不必從一開始就寫所有的類型。你可以先快速的寫代碼,然后再加入類型來讓代碼更穩(wěn)定。
TypeScript同樣也支持高級(jí)類型,像是交叉類型,聯(lián)合類型,類型別名,可辨識(shí)聯(lián)合和類型保護(hù)。你可以在TypeScript Documentation網(wǎng)站的Advanced Types頁面查看。
如果你使用React的話,通過添加React類型,JSX也是支持的。
class Person {
private name: string;
private age: number;
private salary: number;
constructor(name: string, age: number, salary: number) {
this.name = name;
this.age = age;
this.salary = salary;
}
toString(): string {
return `${this.name} (${this.age}) (${this.salary})`;
}
}
——
Elm
Elm是一個(gè)可以編譯成JS,HTML和JS的純函數(shù)式編程語言。你可以只通過Elm創(chuàng)建一個(gè)完整的網(wǎng)站,這使得它是一個(gè)對(duì)像React這樣的Javascript框架的一個(gè)很好的代替。通過它創(chuàng)建的應(yīng)用自動(dòng)使用了虛擬DOM庫,使得它很快。一個(gè)大的加分項(xiàng)是內(nèi)建的結(jié)構(gòu)讓你忘記數(shù)據(jù)流而是關(guān)注于數(shù)據(jù)聲明和邏輯。
在Elm中,所有函數(shù)都是純粹的,這意味著他們總是對(duì)一個(gè)給予的輸入返回一個(gè)相同的輸出。T他們不能做其他任何事情,除非你指定。舉例來說,獲取一個(gè)遠(yuǎn)程的API你會(huì)創(chuàng)建一個(gè)_command_函數(shù)來通訊外部世界,和一個(gè) subscriptions 函數(shù)監(jiān)聽回復(fù)。另一個(gè)純粹的點(diǎn)是,值是不可變的,當(dāng)你需要什么的時(shí)候,你創(chuàng)建一個(gè)新值而不是改變它。
ELm的接受可以是平緩的;可以使用_ports_來和Javascript或其他庫溝通。雖然Elm還沒有到達(dá)版本1,它已經(jīng)用于復(fù)雜大型的應(yīng)用了,這使得它對(duì)復(fù)雜應(yīng)用是一個(gè)可行的解決方案。
ELm其中一個(gè)吸引人的功能是初學(xué)者友好的編譯器,它生成幫助你修復(fù)你的代碼的信息,而不是產(chǎn)生難以閱讀的信息。如果你正在學(xué)習(xí)這門語言,編譯器本身就是一個(gè)大的幫助。
module Main exposing (..) import Html exposing (..) -- MAIN main : Program Never Model Msg main = Html.program { init = init , update = update , view = view , subscriptions = subscriptions } -- INIT type alias Model = String init : ( Model, Cmd Msg ) init = ( "Hello World!", Cmd.none ) -- UPDATE type Msg = DoNothing update : Msg -> Model -> ( Model, Cmd Msg ) update msg model = case msg of DoNothing -> ( model, Cmd.none ) -- VIEW view : Model -> Html Msg view model = div [] [text model] -- SUBSCRIPTIONS subscriptions : Model -> Sub Msg subscriptions model = Sub.none
Get Started with Elm:https://www.sitepoint.com/functional-reactive-programming-elm-introduction/
PureScript
PureScript 是一個(gè)純函數(shù)強(qiáng)類型的編程語言,由Phil Freeman創(chuàng)造。它旨在與現(xiàn)有的JavaScript庫進(jìn)行很好的兼容,與Haskell精神上類似,但是核心保留了Javascript。
PureScript一個(gè)重要的點(diǎn)是它的極簡主義。它沒有包含任何在其他語言認(rèn)為很重要的功能庫。比如,相比于在編譯器中包含generators和promises,你可以自己使用指定的庫來完成這個(gè)任務(wù)。你可以選擇你想要的功能的實(shí)現(xiàn),當(dāng)使用PureScript的時(shí)候需要高效和個(gè)性化的經(jīng)驗(yàn),能使生成的代碼盡可能的小。
這個(gè)編譯器另一個(gè)重要的功能是構(gòu)建出清晰可讀的代碼,能夠兼容Javascript包括庫和工具。
和其他語言一樣,PureScript有它自己的構(gòu)建工具稱為Pulp,可以和Gulp做對(duì)比,只是用這個(gè)語言寫的。
至于類型系統(tǒng),不同于另一個(gè)ML類的語言Elm,PureScript支持更先進(jìn)的類型特性比如高級(jí)類類型和類型類,這些是從Haskell來的特性,允許創(chuàng)建復(fù)雜的抽象。
module Main where import Prelude import Data.Foldable (fold) import TryPureScript main = render $ fold [ h1 (text "Try PureScript!") , p (text "Try out the examples below, or create your own!") , h2 (text "Examples") , list (map fromExample examples) ] where fromExample { title, gist } = link ("?gist=" <> gist) (text title) examples = [ { title: "Algebraic Data Types" , gist: "37c3c97f47a43f20c548" } , { title: "Loops" , gist: "cfdabdcd085d4ac3dc46" } , { title: "Operators" , gist: "3044550f29a7c5d3d0d0" } ]
Get Started with PureScripthttps://github.com/purescript/documentation/blob/master/guides/Getting-Started.md
CoffeeScript
CoffeeScript是一個(gè)旨在暴露JavaScript的精華并提供一個(gè)干凈的語法并在合適地方保留語義的語言。雖然近年來這個(gè)語言的熱度在下降,它正在改變方向并且現(xiàn)在有一個(gè)新的大版本支持ES2015+特性。
你用CoffeeScript寫的代碼直接轉(zhuǎn)化為可讀的Javascript代碼并且兼容現(xiàn)有的庫。從2版本開始,編譯器會(huì)產(chǎn)生兼容最新版本的ECMAScript的代碼,比如,每次你使用class,你就在Javascript中得到class。并且,如果你使用React,好消息是,JSX兼容CoffeeScript。
這個(gè)編譯器有一個(gè)十分有特色的功能是有能力處理用literate style寫的代碼。literate style相比于強(qiáng)調(diào)代碼而把注釋作為添加這種方式,而是你需要在一開始就寫注釋,代碼只是偶爾出現(xiàn)。這種寫代碼的方式由Donald Knuth推薦,使得一個(gè)代碼文件非常像一個(gè)技術(shù)文檔。
相比于其他語言,CoffeeScript代碼可以在瀏覽器中用一個(gè)庫直接執(zhí)行。所以如果你想要寫一個(gè)快速測(cè)試,你可以寫你的代碼在一個(gè)text/coffeescriptscript標(biāo)簽中,并且引入編譯器,這樣就可以把你的代碼輕易的轉(zhuǎn)化為JavaScript了。
# Assignment: number = 42 opposite = true # Conditions: number = -42 if opposite # Functions: square = (x) -> x * x # Arrays: list = [1, 2, 3, 4, 5] # Objects: math = root: Math.sqrt square: square cube: (x) -> x * square x # Splats: race = (winner, runners...) -> print winner, runners # Existence: alert "I knew it!" if elvis? # Array comprehensions: cubes = (math.cube num for num in list)
Get Started with CoffeeScript http://coffeescript.org/v2/#coffeescript-2
ClojureScript
ClojureScript是一個(gè)轉(zhuǎn)化Clojure編程語言為JavaScript的編譯器。Clojure是一個(gè)多用途的函數(shù)式原因伴隨著動(dòng)態(tài)類型和不可變數(shù)據(jù)結(jié)構(gòu)的支持。
這是這個(gè)列表中唯一一個(gè)屬于Lisp家族的語言,自然有著它們共同的特性。舉例來說,代碼可以作為數(shù)據(jù),支持宏系統(tǒng),使得元編程成為可能。Unlike other Lisps, Clojure has support for immutable data structures, making the management of side-effects easier.不同于其他類Lisp,Clojure支持不可變數(shù)據(jù)結(jié)構(gòu),使得函數(shù)副作用的管理更容易。
這個(gè)語法對(duì)初學(xué)者看起嚇人,因?yàn)閳A括號(hào)的使用。但這樣使用是經(jīng)過深思熟慮的,并且在長遠(yuǎn)看來你一定會(huì)感謝這種語法的。語法的極簡和抽象能力使得Lisp成為一個(gè)解決高抽象問題的強(qiáng)力工具。
雖然Clojure主要是一個(gè)函數(shù)式語言,但是不像PureScript或者Elm那樣純粹。函數(shù)副作用還是會(huì)發(fā)生,但是其他函數(shù)式特性也會(huì)存在。
ClojureScript使用Google Closure做代碼優(yōu)化并且也兼容現(xiàn)有的JavaScript庫。
; Extracted from https://github.com/clojure/clojurescript/blob/master/samples/dom/src/dom/test.cljs (ns dom.test (:require [clojure.browser.event :as event] [clojure.browser.dom :as dom])) (defn log [& args] (.log js/console (apply pr-str args))) (defn log-obj [obj] (.log js/console obj)) (defn log-listener-count [] (log "listener count: " (event/total-listener-count))) (def source (dom/get-element "source")) (def destination (dom/get-element "destination")) (dom/append source (dom/element "Testing me ") (dom/element "out!")) (def success-count (atom 0)) (log-listener-count) (event/listen source :click (fn [e] (let [i (swap! success-count inc) e (dom/element :li {:id "testing" :class "test me out please"} "It worked!")] (log-obj e) (log i) (dom/append destination e)))) (log-obj (dom/element "Text node")) (log-obj (dom/element :li)) (log-obj (dom/element :li {:class "foo"})) (log-obj (dom/element :li {:class "bar"} "text node")) (log-obj (dom/element [:ul [:li :li :li]])) (log-obj (dom/element :ul [:li :li :li])) (log-obj (dom/element :li {} [:ul {} [:li :li :li]])) (log-obj (dom/element [:li {:class "baz"} [:li {:class "quux"}]])) (log-obj source) (log-listener-count)
Get Started with ClojureScript https://clojurescript.org/guides/quick-start
Scala.js
Scala.js是一個(gè)將Scala編程語言轉(zhuǎn)化為JavaScript的編譯器。Scala是一個(gè)旨在融合面向?qū)ο蠛秃瘮?shù)式編程兩種思想到一種語言,為了打造容易接受的強(qiáng)力的工具
作為一個(gè)強(qiáng)類型語言,你會(huì)從它部分類型推斷這種靈活的類型系統(tǒng)中受益。大部分的值會(huì)被推斷,但函數(shù)參數(shù)仍然需要明確的類型注釋。
雖然許多通常的面向?qū)ο竽J蕉贾С郑ū热缛魏沃刀际且粋€(gè)對(duì)象并且操作是一個(gè)方法調(diào)用),但你也有函數(shù)式特性比如一等函數(shù)和不可變數(shù)據(jù)結(jié)構(gòu)。
Scala.js其中一個(gè)特殊的優(yōu)勢(shì)是,你可以毫不費(fèi)力的從你熟悉的面向?qū)ο箝_始向更函數(shù)式的轉(zhuǎn)移,以你自己的需要和步調(diào)。同樣的,現(xiàn)存的JavaScript代碼和庫和你的Scala代碼兼容。
Scala的初學(xué)者會(huì)發(fā)現(xiàn)這個(gè)語言和JavaScript并沒有多大不同,對(duì)比下面兩個(gè)意思一樣的代碼:
// JavaScript
var xhr = new XMLHttpRequest();
xhr.open("GET",
"https://api.twitter.com/1.1/search/" +
"tweets.json?q=%23scalajs"
);
xhr.onload = (e) => {
if (xhr.status === 200) {
var r = JSON.parse(xhr.responseText);
$("#tweets").html(parseTweets(r));
}
};
xhr.send();
// Scala.js
val xhr = new XMLHttpRequest()
xhr.open("GET",
"https://api.twitter.com/1.1/search/" +
"tweets.json?q=%23scalajs"
)
xhr.onload = { (e: Event) =>
if (xhr.status == 200) {
val r = JSON.parse(xhr.responseText)
$("#tweets").html(parseTweets(r))
}
}
xhr.send()
Get Started with Scala.jshttps://www.scala-js.org/tutorial/basic/
Reason
Reason是一個(gè)由Facebook創(chuàng)造和維護(hù)的語言,它為OCaml編譯器提供了新的語法,并且代碼可以轉(zhuǎn)換成JavaScript和原生代碼。
作為ML家族的一部分并且自己本身是函數(shù)式語言,它天生提供了強(qiáng)大但是靈活的伴隨類型推斷的類型系統(tǒng),代數(shù)數(shù)據(jù)類型和模式匹配。它也支持不可變數(shù)據(jù)類型和參數(shù)多態(tài)(也被其他語言稱為泛型),但是在OCaml中,也是支持面向?qū)ο缶幊痰摹?/p>
通過 bucklescript綁定就可以使用現(xiàn)存的JavaScript庫。你也可以在你的Reason代碼旁邊混入你的JavaScript。插入的JavaScript代碼不會(huì)嚴(yán)格的檢查,但作為快速修復(fù)和原因也是不錯(cuò)的。
如果你是一個(gè)React開發(fā)者,綁定是可能的,并且這個(gè)語言也支持JSX。
/* A type variant being pattern matched */ let possiblyNullValue1 = None; let possiblyNullValue2 = Some "Hello@"; switch possiblyNullValue2 { | None => print_endline "Nothing to see here." | Some message => print_endline message }; /* Parametrized types */ type universityStudent = {gpa: float}; type response 'studentType = {status: int, student: 'studentType}; let result: response universityStudent = fetchDataFromServer (); /* A simple typed object */ type payload = Js.t {. name: string, age: int }; let obj1: payload = {"name": "John", "age": 30};
Get Started with Reason https://reasonml.github.io/guide/javascript/quickstart
Haxe
Haxe是一個(gè)多范式編程語言,并且它的編譯器可以產(chǎn)生二進(jìn)制或者其他語言的源代碼。
雖然Haxe提供了嚴(yán)格的類型系統(tǒng)并帶有類型推斷,它也可以作為動(dòng)態(tài)語言只要目標(biāo)語言支持。同樣的,它也支持多種的編程風(fēng)格比如面向?qū)ο螅盒停瘮?shù)式。
當(dāng)你寫Haxe代碼的時(shí)候,你可以為編譯指定多個(gè)平臺(tái)或語言,但不需要對(duì)代碼做什么大的改變。指定目標(biāo)的代碼塊也支持。
你可以用Haxe同時(shí)寫前端和后端用同樣的代碼,并且通過Haxe Remoting進(jìn)行溝通,既可以同步連接也可以異步連接。
不出所料,Haxe代碼可以兼容現(xiàn)有的庫但也提供了成熟的標(biāo)準(zhǔn)庫。
// Example extracted from http://code.haxe.org
extern class Database {
function new();
function getProperty<T>(property:Property<T>):T;
function setProperty<T>(property:Property<T>, value:T):Void;
}
abstract Property<T>(String) {
public inline function new(name) {
this = name;
}
}
class Main {
static inline var PLAYER_NAME = new Property<String>("playerName");
static inline var PLAYER_LEVEL = new Property<Int>("playerLevel");
static function main() {
var db = new Database();
var playerName = db.getProperty(PLAYER_NAME);
trace(playerName.toUpperCase());
db.setProperty(PLAYER_LEVEL, 1);
}
}
Get Started with Reasonhttps://haxe.org/documentation/introduction/language-introduction.html
Nim
Nim是一個(gè)靜態(tài)類型,多范式編程語言,有著極簡風(fēng)格與空格敏感的語法,編譯為C,C++和JavaScript。
這個(gè)語言本身很小,但它的元編程能力會(huì)吸引你自己去實(shí)現(xiàn)一些在別的語言內(nèi)置的功能。這些構(gòu)建模塊有宏,模板和泛型,通過它們你可以實(shí)現(xiàn)不論是簡單的功能還是不同的泛型。這使得Nim成為一個(gè)非常通用的語言可以適應(yīng)你的需求,有著Lisp的精髓。
Nim的語法抽象功能允許你去讓語言去適應(yīng)你的功能,讓真正的[DSLs][20]成為可能。如果你有著專門的任務(wù)需要處理,你可以獲得更高級(jí)的表達(dá)性。
# Reverse a string proc reverse(s: string): string = result = "" for i in countdown(high(s), 0): result.add s[i] var str1 = "Reverse This!" echo "Reversed: ", reverse(str1) # Using templates template genType(name, fieldname: expr, fieldtype: typedesc) = type name = object fieldname: fieldtype genType(Test, foo, int) var x = Test(foo: 4566) echo(x.foo) # 4566
Get Started with Nimhttps://nim-lang.org/documentation.html
結(jié)尾
如果JavaScript不是你最喜歡的語言,你依然可以創(chuàng)建web應(yīng)用而不用忍受這個(gè)技術(shù)的缺點(diǎn)。可供選擇的范圍很廣,從純粹的函數(shù)式語言,比如PureScript,到面向?qū)ο笳Z言,比如Dart。并且如果你想要不只是語言的轉(zhuǎn)化,你也可以選擇比如Elm,Elm提供像是虛擬DOM和內(nèi)置的架構(gòu)這樣的工具。
你是否有嘗試了這篇文章的任何一種語言,又或者你有自己的推薦?請(qǐng)?jiān)谠u(píng)論中讓我知道!
今天我們一起來了解下HTML,
首先HTmL包含三層結(jié)構(gòu),分別是結(jié)構(gòu)層,表現(xiàn)層,行為層。
結(jié)構(gòu)層:html => 網(wǎng)頁上有什么,比如說文字啊、按鈕啊、圖片啊等等。
表現(xiàn)層:css => 顯示成什么樣子,比如說文字的大小啊,位置啊,顏色啊等等。
行為層:JavaScript => 具體怎么操作,比如說點(diǎn)擊按鈕讓圖片放大縮小等等。
===============================
在了解了html的三層結(jié)構(gòu)之后,我們來學(xué)習(xí)如何寫html。html不是編程語言,它是一套標(biāo)簽。最簡單的html文本是下圖1這個(gè)樣子。我們可以在電腦桌面上新建一個(gè)記事本文件,然后把后綴名改一下(.txt=>.html),把這段標(biāo)簽代碼粘貼到html文件里,這樣一個(gè)空白的網(wǎng)頁就做成了。如果需要在網(wǎng)頁上添加內(nèi)容,我們只需要在第10行的位置添加各種各樣的標(biāo)簽即可。比如我在圖二添加了一個(gè)按鈕標(biāo)簽和一段文字標(biāo)簽,雙擊html文件,頁面上就從左到右,從上到下顯示對(duì)應(yīng)的內(nèi)容。是不是很簡單。我們?nèi)粘g覽的網(wǎng)頁都是這樣一個(gè)標(biāo)簽一個(gè)標(biāo)簽畫上去的。
我給大家總結(jié)了一張圖,基本上覆蓋了工作中常用的知識(shí)點(diǎn)。同時(shí)分享幾個(gè)小技巧。
1.最簡單的網(wǎng)頁寫成什么樣子,也就是html模板不需要記憶,下圖也說了,去百度下載一個(gè)VSCode軟件(類似于記事本,是現(xiàn)在主流的前端代碼編輯器),用它打開我們的html文件,輸入英文嘆號(hào)回車就自動(dòng)生成了,學(xué)編程不要死記硬背。
2.控件的標(biāo)簽不需要記憶,直接百度html XXX標(biāo)簽,例如:百度搜“html按鈕標(biāo)簽”,他就會(huì)告訴我們是<button>,用的時(shí)間長了自然就記住了。是不是省力。
3.標(biāo)簽的屬性很重要,可以不去記他的寫法,因?yàn)閷懣梢园俣龋匾氖悄阈枰涀?biāo)簽有什么屬性,下圖的屬性記住足矣。為什么要記呢,因?yàn)楣ぷ髦校械臅r(shí)候會(huì)遇到這樣一種情況,明明設(shè)置一個(gè)屬性可以完成的功能,我們不知道,花費(fèi)了大力氣用css和js去實(shí)現(xiàn),結(jié)果還存在著特定場(chǎng)合的bug,讓人很無奈。
4.對(duì)于html還有兩個(gè)標(biāo)簽<canvas>和<svg>,他們是用來繪圖的,做特殊效果的。我們可以先跳過,等框架啥的都學(xué)完了,有興趣,學(xué)習(xí)一下。
5.給大家推薦一個(gè)小白學(xué)習(xí)html的網(wǎng)站,w3cschool,圖里不明白的可以去上邊學(xué)學(xué)練練。
6.如果覺得一個(gè)人學(xué)習(xí)前端有難度,我建了一個(gè)小白前端學(xué)習(xí)交流群,可以私聊我,大家在群里多多交流,我會(huì)經(jīng)常給大家答疑,組織大家練習(xí),一起做小項(xiàng)目。有方向,少走彎路。
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。