成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【速記】借助ES6的模版字符串,在不用Babel插件的情況下實現(xiàn)一個輕量級類JSX功能

wayneli / 3343人閱讀

摘要:引發(fā)此篇文章是看到了阮一峰的在掘金上的轉(zhuǎn)載的作者創(chuàng)建的利用字符串標簽模版實現(xiàn)的類的庫,可以將標簽模版的類字符串轉(zhuǎn)化成類或函數(shù)用來創(chuàng)建對象的函數(shù)字符串介紹重點閱讀模版字符串和標簽模版兩節(jié)瀏覽器級別將字符串解析成對象原始的思考原文如下

引發(fā)此篇文章是看到了阮一峰的twitter在掘金上的轉(zhuǎn)載:?https://juejin.im/pin/5bf6463...

Preact 的作者創(chuàng)建的利用字符串標簽模版實現(xiàn)的類JSX的庫,可以將標簽模版的類JSX字符串轉(zhuǎn)化成類React.createElement或h函數(shù)(用來創(chuàng)建?virtual DOM對象的函數(shù)):?https://github.com/developit/htm

ES6字符串介紹(重點閱讀模版字符串和標簽模版兩節(jié)):http://es6.ruanyifeng.com/#do...

瀏覽器級別API將字符串解析成DOM對象:https://developer.mozilla.org...

原始的思考原文如下:

JSX Quasi-Literal

I"ve been struggling to get the JSX transpiler playing nicely with the?traceur compiler, specifically the flags hidden behind?--experimental.

The problem is that the since both the JSX transpiler and the traceur compiler are actually parsing the full javascript AST, they would have to mutually agree on the syntax extensions you use: traceur can"t parse the faux-xml syntax JSX adds, and JSX can"t parse the?async?or?await?keywords, for example, or generator functions.

This proof-of-concept is a potential solution: instead of using an external JSX transpiler, we"ll parse the faux-xml ourselves, using an ES6 feature called?quasi-literals.

Example

define(function(require) {
 ? ?var React ? = require("react");
 ? ?var jsx ? ? = require("lib/jsxquasi");
 ? ?var EchoComponent = React.createClass({
 ? ? ? ?getInitialState: function() {
 ? ? ? ? ? ?return { value: "" };
 ? ? ?  },
 ? ? ? ?handleChange: function() {
 ? ? ? ? ? ?this.setState({ value: this.refs.input.getDOMNode().value });
 ? ? ?  },
 ? ? ? ?render: function() {
 ? ? ? ? ? ?return jsx`
 ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?${this.state.value} ? ? ? ? ? ? ? ?
? ? ? ? ? ?`; ? ? ? } ? }) ? ?return function() { ? ? ? ?var comp = jsx`<${EchoComponent} />`; ? ? ? ?React.renderComponent(comp, document.body); ? }; });

A couple of things to notice:

This is valid javascript! Or harmony or es6 or whatever, but importantly, it"s not happening outside the js environment. This also allows us to use our standard tooling: the traceur compiler knows how to turn?jsx

Hello
;?into the equivalent browser compatible es3, and hence we can use anything the traceur compile accepts!

This is not exactly the same as JSX according to the spec: it includes quotes around the attributes, etc. This is because this parser is based on?DOMParser, and hence needs to be valid XML. It would be straighforward though to change it so it matched exactly, or to remove the browser dependency (so it could run on the server, eg.)

index.js

define(function(require) {

 ? ?var React = require("react");
 ? ?var paramRegex ?= /__(d)+/;
 ? ?var parser ? ? ?= new DOMParser();
 ? ?var errorDoc ? ?= parser.parseFromString("INVALID", "text/xml");
 ? ?var errorNs ? ? = errorDoc.getElementsByTagName("parsererror")[0].namespaceURI;
 ? ?// turns the array of string parts into a DOM
 ? ?// throws if the result is an invalid XML document.
 ? ?function quasiToDom(parts) {
 ? ?
 ? ? ? ?// turn ["
Hi
"] ? ? ? ?// into "
Hi
" ? ? ? ?var xmlstr = parts.reduce((xmlstr, part, i) => { ? ? ? ? ? ?xmlstr += part; ? ? ? ? ? ?if (i != parts.length - 1) { // the last part has no ending param ? ? ? ? ? ? ? ?xmlstr += `__${i}`; ? ? ? ? ? } ? ? ? ? ? ?return xmlstr; ? ? ? }, ""); ? ? ? // parse into DOM, check for a parse error ? ? ? // browser"s DOMParser is neat, but error handling is awful ? ? ? var doc ? ? ?= parser.parseFromString(xmlstr, "text/xml"); ? ? ? var errors ? = doc.getElementsByTagNameNS(errorNs, "parsererror"); ? ? ? var error ? ?= ""; ? ? ? if (errors.length > 0) { ? ? ? ? ? error = errors[0].textContent.split(" ")[0]; ? ? ? ? ? throw `invalid jsx: ${error} ${xmlstr}`; ? ? ? } ? ? ? return doc; ? } ? ?// turn a document into a tree of react components ? ?// replaces tags, attribute values and text nodes that look like the param ? ?// placeholder we add above, with the values from the parameters array. ? ?function domToReact(node, params) { ? ? ? ?var match; ? ? ? ? ? ? ? ?// text node, comment, etc ? ? ? ?if (node.nodeValue) { ? ? ? ? ? ?var value = node.nodeValue.trim(); ? ? ? ? ? ?if (value.length === 0) { ? ? ? ? ? ? ? ?return undefined; ? ? ? ? ? } ? ? ? ? ? ?match = value.match(paramRegex); ? ? ? ? ? ?return match ? params[parseInt(match[1])] : value; ? ? ? } ? ? ? ?// node to get react for ? ? ? ?// if the node name is a placeholder, assume the param is a component class ? ? ? ?var reactNode; ? ? ? ?match = node.localName.match(paramRegex) ? ? ? ?reactNode = match ? params[parseInt(match[1])] : React.DOM[node.localName]; ? ? ? ? ? ? ? ? ? ?// if we don"t have a component, give a better error message ? ? ? ?if (reactNode === undefined) { ? ? ? ? ? ?throw `Unknown React component: ${node.localName}, bailing.`; ? ? ? } ? ? ? ?// attributes of the node ? ? ? ?var reactAttrs = {}; ? ? ? ?for (var i = node.attributes.length - 1; i >= 0; i--) { ? ? ? ? ? ?var attr = node.attributes[i]; ? ? ? ? ? ?reactAttrs[attr.name] = attr.value; ? ? ? ? ? ?match = attr.value.match(paramRegex); ? ? ? ? ? ?if (match) { ? ? ? ? ? ? ? ?reactAttrs[attr.name] = params[parseInt(match[1])]; ? ? ? ? ? } ? ? ? } ? ? ? ?// recursively turn children into react components ? ? ? ?var reactChildren = []; ? ? ? ?for (var i = 0; i < node.childNodes.length; i++) { ? ? ? ? ? ?var child = node.childNodes[i]; ? ? ? ? ? ?var reactChild = domToReact(child, params); ? ? ? ? ? ?if (reactChild) { ? ? ? ? ? ? ? ?reactChildren.push(reactChild); ? ? ? ? ? } ? ? ? } ? ? ? ?return reactNode(reactAttrs, reactChildren); ? } ? ?return function jsx(parts, ...params) { ? ? ? ?var doc ? ? = quasiToDom(parts); ? ? ? ?var react ? = domToReact(doc.firstChild, params); ? ? ? ?return react; ? } });

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/99392.html

相關(guān)文章

  • webpack實戰(zhàn)

    摘要:和類似的預處理器還有等。的用處非常多,包括給自動加前綴使用下一代語法等,目前越來越多的人開始用它,它很可能會成為預處理器的最終贏家。 webpack實戰(zhàn) 查看所有文檔頁面:全棧開發(fā),獲取更多信息。快馬加鞭,加班加點,終于把這個文檔整理出來了,順便深入地學習一番,鞏固知識,就是太累人,影響睡眠時間和質(zhì)量。極客就是想要把事情做到極致,開始了就必須到達終點。 原文鏈接:webpack實戰(zhàn),原...

    cyrils 評論0 收藏0
  • 手把手教你從零搭建react局部熱加載環(huán)境

    摘要:有沒有辦法實現(xiàn)就局部刷新呢當然是有第十步執(zhí)行為了實現(xiàn)局部熱加載,我們需要添加插件。 前言 用了3個多月的vue自認為已經(jīng)是一名合格的vue框架api搬運工,對于vue的api使用到達了一定瓶頸,無奈水平有限,每每深入底層觀賞源碼時候都迷失了自己。 遂決定再找個框架學習學習看看能否突破思維局限,加上本人早已對React、RN技術(shù)垂涎已久,于是決定找找教程來學習。無奈第一步就卡在了環(huán)境搭...

    quietin 評論0 收藏0
  • ES6,你不得不學!

    摘要:但是,的本質(zhì)仍然是函數(shù),是構(gòu)造函數(shù)的另外一種寫法。報錯原生構(gòu)造函數(shù)的繼承對于一些原生的構(gòu)造函數(shù),比如,,,等,在是無法通過方法實現(xiàn)原生函數(shù)的內(nèi)部屬性,原生函數(shù)內(nèi)部的無法綁定,內(nèi)部屬性獲得不了。 在沒有學習 ES6 之前,學習 React,真的是一件非常痛苦的事情。即使之前你對 ES5 有著很好的基礎(chǔ),包括閉包、函數(shù)、原型鏈和繼承,但是 React 中已經(jīng)普遍使用 ES6 的語法,包括 ...

    CKJOKER 評論0 收藏0
  • webpack從零開始

    摘要:一基礎(chǔ)配置項目安裝安裝并新建文件,并初始化文件入口出口配置插件安裝配置用來解析文件轉(zhuǎn)譯成瀏覽器可以識別的文件。以形式在頁面中插入代碼加載文件是否開啟代碼壓縮。 一.基礎(chǔ)配置 1.init項目 mkdir react-webpack-demo cd react-webpack-demo mkdir src mkdir dist npm init -y 2.安裝webpack 安裝webp...

    darkbug 評論0 收藏0
  • React項目從Javascript到Typescript遷移經(jīng)驗總結(jié)

    摘要:面對越來越火的,我們公司今年也逐漸開始擁抱。綜上所述,我個人覺得是要刪除相關(guān)的東西,降低項目復雜度。但是有一個例外情況。這個配置項有三個值可選擇,分別是和。模式會生成,在使用前不需要再進行轉(zhuǎn)換操作了,輸出文件的擴展名為。 拋轉(zhuǎn)引用 現(xiàn)在越來越多的項目放棄了javascript,而選擇擁抱了typescript,就比如我們熟知的ant-design就是其中之一。面對越來越火的typesc...

    zhisheng 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<