成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

從這個(gè)API能看到整個(gè)前端的縮影

開(kāi)發(fā) 前端
本文我們從這個(gè)API出發(fā),來(lái)聊聊Web的發(fā)展。

大家好,我卡頌。

如果要從JS中找一個(gè)API作為整個(gè)前端的縮影,ESM規(guī)范中的import再合適不過(guò)了。

本文我們從這個(gè)API出發(fā),來(lái)聊聊web的發(fā)展。

web的本質(zhì)是開(kāi)放

在所有JS?運(yùn)行時(shí)中,web?是最開(kāi)放的(緊隨其后的可能是deno?)。這一點(diǎn)可以從import語(yǔ)法的「模塊說(shuō)明符」窺探一絲端倪。

// 模塊說(shuō)明符為 './a.js'
import xxx from './a.js'

在ES規(guī)范中只明確「模塊說(shuō)明符是一個(gè)字符串字面量」,并沒(méi)有限制「如何解析模塊說(shuō)明符」,所以「解析模塊說(shuō)明符」的任務(wù)就交給了宿主環(huán)境。

在web?的HTML規(guī)范中,「模塊說(shuō)明符」可以是如下形式:

  • 絕對(duì)路徑的url,比如:
import confetti from 'https://cdn.skypack.dev/canvas-confetti';
  • 以/、./、../開(kāi)頭的相對(duì)路徑,比如:
import xxx from './a.js'
  • 定義模塊名到url的映射,再以模塊名的形式引入,比如:
<script type="importmap">
{
"imports": {
"moment": "/node_modules/moment/src/moment.js"
}
}
</script>

再引入模塊:

import moment from "moment";

PS:這種方式被稱為import-maps[1],當(dāng)前瀏覽器兼容性還不高:

圖片

可以發(fā)現(xiàn),這三種方式對(duì)「模塊說(shuō)明符」的來(lái)源都很開(kāi)放。反觀??Node.js??運(yùn)行時(shí),如果以包名的形式引入模塊,比如:

import moment from "moment";

背后是一套指向node_modules,并最終指向npm庫(kù)的機(jī)制。npm是家私人公司,被github收購(gòu),而github被微軟收購(gòu)。

所以,如果某一天國(guó)內(nèi)無(wú)法直接安裝npm包,也不必驚訝,畢竟他的背后是一家私人公司。

與之相對(duì),web的開(kāi)放讓他不會(huì)面臨這種囧境。

兼容性的迭代

web?的發(fā)展史,就是一部「新三年、舊三年、修修補(bǔ)補(bǔ)又三年」的兼容史。很多API?的兼容性問(wèn)題可以通過(guò)polyfill解決。

所以,很自然的,庫(kù)作者在面對(duì)模塊規(guī)范的兼容性問(wèn)題時(shí),也想替用戶做到最好。但是,這份努力也讓代碼行為變得更撲朔迷離。

比如:在ESM?模塊中是可以引入CJS?模塊的。對(duì)于如下CJS模塊:

// a.js cjs模塊
exports.hello = () {
console.log('hello')
}

在同級(jí)的ESM模塊中引入,并通過(guò)解構(gòu)或者對(duì)象方法來(lái)使用hello:

import utils from './a.js';

const {hello} = utils;
// 或者
const hello = utils.hello;

為什么不能直接以「具名引入」的形式使用hello呢:

// 不能這樣
import {hello} from './a.js'

這是因?yàn)镋SM規(guī)范的導(dǎo)入聲明都是靜態(tài)的,而CJS規(guī)范的導(dǎo)出是動(dòng)態(tài)的,所以當(dāng)ESM模塊引入CJS模塊時(shí),在編譯時(shí)是沒(méi)法知道有哪些導(dǎo)出的。

這很符合規(guī)范,但看起來(lái)有點(diǎn)不符合直覺(jué)。

比如,React只提供了CJS規(guī)范的包,所以在ESM模塊中正確的引入方式是:

import React from 'react';
const { useState } = React;

而大家日常開(kāi)發(fā)顯然下面這種方式用的更多:

import { useState } from 'react';

之所以這么引入不會(huì)報(bào)錯(cuò),是因?yàn)閹?kù)作者(比如vite、babel)在編譯時(shí)默默做了轉(zhuǎn)換。

為了方便開(kāi)發(fā)者而違背規(guī)范,這其實(shí)是個(gè)很不好的事(類似的事還有npm、yarn的影子依賴)。

但開(kāi)發(fā)者喜聞樂(lè)見(jiàn)的API就是好API,整個(gè)web的發(fā)展就是修修補(bǔ)補(bǔ)螺旋向上的。

bundle將長(zhǎng)期存在

在vite橫空出世,帶來(lái)極致的開(kāi)發(fā)時(shí)速度后,社區(qū)就掀起一股「bundle vs bundleless」的討論。

既然bundleless能為開(kāi)發(fā)環(huán)境帶來(lái)提速,同樣的優(yōu)勢(shì)能不能也帶到生產(chǎn)環(huán)境?或者更極端點(diǎn),未來(lái)前端會(huì)逐漸拋棄打包工具么?

從ESM?規(guī)范的角度出發(fā),答案是否定的。有兩個(gè)剛需現(xiàn)階段bundleless還無(wú)法解決:

  • tree shaking
  • ESM模塊過(guò)多,導(dǎo)致發(fā)起大量請(qǐng)求

所以,在未來(lái)很長(zhǎng)一段時(shí)間內(nèi),打包工具仍會(huì)存在。

總結(jié)

在我的技術(shù)群中,經(jīng)常看到新人前端發(fā)出感嘆:「不知道該學(xué)啥」。

究其原因,當(dāng)前的前端開(kāi)發(fā),主要是使用「集成了最佳實(shí)踐的各種大型框架」(比如Nuxt?、Next.js?、UmiJS...)。而這些封裝完備的框架為了降低上手門檻,隱藏了大量技術(shù)細(xì)節(jié)。

如果你也有這種迷茫,我建議你從ESM規(guī)范開(kāi)始學(xué)起。

他就像一張地圖,能夠串聯(lián)起前端的方方面面。

參考資料

[1]import-maps:https://github.com/WICG/import-maps

責(zé)任編輯:姜華 來(lái)源: 魔術(shù)師卡頌
相關(guān)推薦

2012-09-18 15:35:45

云計(jì)算創(chuàng)意大賽微軟

2021-04-28 22:42:36

SaaS軟件技術(shù)

2017-03-29 20:43:32

線上日志磁盤

2020-12-02 09:47:07

DNSIP地址廣告彈窗

2023-03-21 23:48:31

ChatGPT漏洞安全

2022-12-29 08:22:32

JOINCPU系統(tǒng)

2020-09-07 12:53:56

.NET 5Web應(yīng)用框架

2025-03-24 07:15:00

WebWorkerWeb瀏覽器

2016-09-22 13:42:45

用友

2021-04-07 14:05:59

數(shù)據(jù)科學(xué)CIOCDO

2023-09-21 21:55:44

2012-09-06 13:12:41

架構(gòu)師ArchSummit

2020-11-10 09:11:02

采集數(shù)據(jù)

2022-12-07 13:39:51

蘋果造車

2013-03-15 10:35:17

編程語(yǔ)言編程笑話

2020-08-06 18:11:15

SaaS

2017-05-23 10:19:27

2020-07-31 11:01:46

BI新基建國(guó)產(chǎn)化

2010-10-15 10:35:18

2020-08-10 16:10:02

微軟WindowsWindows 10
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日韩视频专区 | 一区二区av | 中文字幕国 | 日韩一区二区免费视频 | 国产精品毛片一区二区在线看 | 欧美精品网站 | 国产午夜精品一区二区三区在线观看 | 成人精品一区二区三区中文字幕 | 免费黄网站在线观看 | 久久男人 | 综合激情久久 | 日产精品久久久一区二区福利 | 亚洲大片一区 | www.888www看片| 欧美国产精品久久久 | 丁香一区二区 | 国产高清视频一区二区 | 国产福利91精品一区二区三区 | 欧美亚洲视频 | 日韩视频一级 | 久热精品在线播放 | 国产精品免费一区二区三区 | 青青草这里只有精品 | 欧美日韩成人在线观看 | 欧美午夜影院 | 久久伊人免费视频 | 成年免费视频 | 五月天天丁香婷婷在线中 | 亚洲va国产日韩欧美精品色婷婷 | 亚洲第一在线视频 | 精品国产一区二区国模嫣然 | 精品av| 日日干夜夜操 | 一区二区三区在线观看免费视频 | 99爱国产 | 男人的天堂在线视频 | www.夜夜草| 精品一区二区三区四区五区 | 国产成人精品久久 | 99国产视频| 亚洲97 |