<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Specter</title>
        <link>https://paragraph.com/@specterv</link>
        <description>undefined</description>
        <lastBuildDate>Wed, 08 Jul 2026 13:30:51 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[CSS-in-JS]]></title>
            <link>https://paragraph.com/@specterv/css-in-js</link>
            <guid>PtzUVpWEshQkGFBbVZqk</guid>
            <pubDate>Mon, 08 Nov 2021 13:30:25 GMT</pubDate>
            <description><![CDATA[CSS-in-JS是组织CSS代码的方式，代表库有styled-component和emotion 传统CSS的缺陷缺乏模块组织 传统的JS和CSS都没有模块的概念，后来在JS界陆续有了 CommonJS 和 ECMAScript Module，CSS-in-JS可以用模块化的方式组织CSS，依托于JS的模块化方案，比如：// button1.ts import styled from '@emotion/styled' export const Button = styled.button color: turquoise; // button2.ts import styled from '@emotion/styled' export const Button = styled.button font-size: 16px; 两个文件的两个同名元素的CSS不会互相影响 2. 缺乏作用域 传统的CSS只有一个全局作用域，比如说一个class可以匹配全局的任意元素。随着项目成长，CSS会变得越来越难以组织，最终导致失控。CSS-in-JS可以通过生成独特的选择符，来实现作用域的...]]></description>
            <content:encoded><![CDATA[<p>CSS-in-JS是组织CSS代码的方式，代表库有styled-component和emotion</p><p>传统CSS的缺陷</p><ol><li><p>缺乏模块组织 传统的JS和CSS都没有模块的概念，后来在JS界陆续有了 CommonJS 和 ECMAScript Module，CSS-in-JS可以用模块化的方式组织CSS，依托于JS的模块化方案，比如：</p></li></ol><pre data-type="codeBlock" text="// button1.ts
import styled from &apos;@emotion/styled&apos;

export const Button = styled.button  color: turquoise;
// button2.ts
import styled from &apos;@emotion/styled&apos;

export const Button = styled.button  font-size: 16px;
"><code><span class="hljs-comment">// button1.ts</span>
<span class="hljs-keyword">import</span> styled <span class="hljs-keyword">from</span> <span class="hljs-string">'@emotion/styled'</span>

<span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> <span class="hljs-title class_">Button</span> = styled.<span class="hljs-property">button</span>  <span class="hljs-attr">color</span>: turquoise;
<span class="hljs-comment">// button2.ts</span>
<span class="hljs-keyword">import</span> styled <span class="hljs-keyword">from</span> <span class="hljs-string">'@emotion/styled'</span>

<span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> <span class="hljs-title class_">Button</span> = styled.<span class="hljs-property">button</span>  font-<span class="hljs-attr">size</span>: 16px;
</code></pre><p>两个文件的两个同名元素的CSS不会互相影响 2. 缺乏作用域 传统的CSS只有一个全局作用域，比如说一个class可以匹配全局的任意元素。随着项目成长，CSS会变得越来越难以组织，最终导致失控。CSS-in-JS可以通过生成独特的选择符，来实现作用域的效果</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/739944b4b36f360ec7af81487e6137e60f1c967b3f57d697dbe4c3fbc8c72de0.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><pre data-type="codeBlock" text="const css = styleBlock =&gt; {
const className = Hash(styleBlock);
const styleEl = document.createElement(&apos;style&apos;);
styleEl.textContent =     .${className} {       ${styleBlock}     }  ;
document.head.appendChild(styleEl);
return className;
};
const className = css(  color: red;   padding: 20px;); // &apos;c23j4&apos;
"><code>const <span class="hljs-attr">css</span> = styleBlock => {
const <span class="hljs-attr">className</span> = Hash(styleBlock)<span class="hljs-comment">;</span>
const <span class="hljs-attr">styleEl</span> = document.createElement(<span class="hljs-string">'style'</span>)<span class="hljs-comment">;</span>
<span class="hljs-attr">styleEl.textContent</span> =     .<span class="hljs-variable">${className}</span> {       <span class="hljs-variable">${styleBlock}</span>     }  <span class="hljs-comment">;</span>
document.head.appendChild(styleEl)<span class="hljs-comment">;</span>
return className<span class="hljs-comment">;</span>
}<span class="hljs-comment">;</span>
const <span class="hljs-attr">className</span> = css(  color: red<span class="hljs-comment">;   padding: 20px;); // 'c23j4'</span>
</code></pre><p>3. 隐式依赖，让样式难以追踪 比如这个CSS样式：</p><pre data-type="codeBlock" text=".target .name h1 {
color: red
}

body #container h1 {
color: green
}
&lt;!doctype html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;body&gt;
&lt;div id=&apos;container&apos;&gt;
&lt;div class=&apos;target&apos;&gt;
&lt;div class=&apos;name&apos;&gt;
&lt;h1&gt;颜色？&lt;/h1&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
"><code>.target .<span class="hljs-built_in">name</span> h1 {
color: red
}

body #container h1 {
color: green
}
<span class="hljs-operator">&#x3C;</span><span class="hljs-operator">!</span>doctype html<span class="hljs-operator">></span>
<span class="hljs-operator">&#x3C;</span>html lang<span class="hljs-operator">=</span><span class="hljs-string">"en"</span><span class="hljs-operator">></span>
<span class="hljs-operator">&#x3C;</span>body<span class="hljs-operator">></span>
<span class="hljs-operator">&#x3C;</span>div id<span class="hljs-operator">=</span><span class="hljs-string">'container'</span><span class="hljs-operator">></span>
<span class="hljs-operator">&#x3C;</span>div class<span class="hljs-operator">=</span><span class="hljs-string">'target'</span><span class="hljs-operator">></span>
<span class="hljs-operator">&#x3C;</span>div class<span class="hljs-operator">=</span><span class="hljs-string">'name'</span><span class="hljs-operator">></span>
<span class="hljs-operator">&#x3C;</span>h1<span class="hljs-operator">></span>颜色？<span class="hljs-operator">&#x3C;</span><span class="hljs-operator">/</span>h1<span class="hljs-operator">></span>
<span class="hljs-operator">&#x3C;</span><span class="hljs-operator">/</span>div<span class="hljs-operator">></span>
<span class="hljs-operator">&#x3C;</span><span class="hljs-operator">/</span>div<span class="hljs-operator">></span>
<span class="hljs-operator">&#x3C;</span><span class="hljs-operator">/</span>div<span class="hljs-operator">></span>
<span class="hljs-operator">&#x3C;</span><span class="hljs-operator">/</span>body<span class="hljs-operator">></span>
<span class="hljs-operator">&#x3C;</span><span class="hljs-operator">/</span>html<span class="hljs-operator">></span>
</code></pre><p>比较麻烦判断h1元素最终显式为什么颜色，DOM树越复杂越难追踪</p><p>而CSS-in-JS的方案就简单直接、易于追踪</p><pre data-type="codeBlock" text="export const Title = styled.h1  color: green;
&lt;Title&gt;
颜色？
&lt;/Title&gt;
"><code>export const Title <span class="hljs-operator">=</span> styled.h1  color: green;
<span class="hljs-operator">&#x3C;</span>Title<span class="hljs-operator">></span>
颜色？
<span class="hljs-operator">&#x3C;</span><span class="hljs-operator">/</span>Title<span class="hljs-operator">></span>
</code></pre><p>4. 没有变量 传统的CSS规则里没有变量，但是在 CSS-in-JS 中可以方便地控制变量</p><pre data-type="codeBlock" text="const Container = styled.div(props =&gt; ({
display: &apos;flex&apos;,
flexDirection: props.column &amp;&amp; &apos;column&apos;//加入条件判断或变量计算
}))
"><code>const Container <span class="hljs-operator">=</span> styled.div(props <span class="hljs-operator">=</span><span class="hljs-operator">></span> ({
display: <span class="hljs-string">'flex'</span>,
flexDirection: props.column <span class="hljs-operator">&#x26;</span><span class="hljs-operator">&#x26;</span> <span class="hljs-string">'column'</span><span class="hljs-comment">//加入条件判断或变量计算</span>
}))
</code></pre><p>5. CSS选择器与HTML元素耦合</p><pre data-type="codeBlock" text="
.target .name h1 {
color: red
}

body #container h1 {
color: green
}
&lt;!doctype html&gt;
&lt;html lang=&quot;en&quot;&gt;
&lt;body&gt;
&lt;div id=&apos;container&apos;&gt;
&lt;div class=&apos;target&apos;&gt;
&lt;div class=&apos;name&apos;&gt;
&lt;h1&gt;我是啥颜色？&lt;/h1&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
"><code>
.target .<span class="hljs-built_in">name</span> h1 {
color: red
}

body #container h1 {
color: green
}
<span class="hljs-operator">&#x3C;</span><span class="hljs-operator">!</span>doctype html<span class="hljs-operator">></span>
<span class="hljs-operator">&#x3C;</span>html lang<span class="hljs-operator">=</span><span class="hljs-string">"en"</span><span class="hljs-operator">></span>
<span class="hljs-operator">&#x3C;</span>body<span class="hljs-operator">></span>
<span class="hljs-operator">&#x3C;</span>div id<span class="hljs-operator">=</span><span class="hljs-string">'container'</span><span class="hljs-operator">></span>
<span class="hljs-operator">&#x3C;</span>div class<span class="hljs-operator">=</span><span class="hljs-string">'target'</span><span class="hljs-operator">></span>
<span class="hljs-operator">&#x3C;</span>div class<span class="hljs-operator">=</span><span class="hljs-string">'name'</span><span class="hljs-operator">></span>
<span class="hljs-operator">&#x3C;</span>h1<span class="hljs-operator">></span>我是啥颜色？<span class="hljs-operator">&#x3C;</span><span class="hljs-operator">/</span>h1<span class="hljs-operator">></span>
<span class="hljs-operator">&#x3C;</span><span class="hljs-operator">/</span>div<span class="hljs-operator">></span>
<span class="hljs-operator">&#x3C;</span><span class="hljs-operator">/</span>div<span class="hljs-operator">></span>
<span class="hljs-operator">&#x3C;</span><span class="hljs-operator">/</span>div<span class="hljs-operator">></span>
<span class="hljs-operator">&#x3C;</span><span class="hljs-operator">/</span>body<span class="hljs-operator">></span>
<span class="hljs-operator">&#x3C;</span><span class="hljs-operator">/</span>html<span class="hljs-operator">></span>
</code></pre><p>如果想把 h1 改成h2，必须要同时改动 CSS 和 HTML。而在CSS-in-JS中，HTML和CSS是结合在一起的，易于修改</p><p>Emotion 介绍 library： <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/emotion-js/emotion">https://github.com/emotion-js/emotion</a></p><p>docs： <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://emotion.sh/docs/introduction">https://emotion.sh/docs/introduction</a></p><p>emotion是一个JavaScript库，使用emotion可以用写js的方式写css代码。在react中安装emotion后，可以很方便进行css的封装，复用。使用emotion后，浏览器渲染出来的标签是会加上一个css开头的标识。</p><pre data-type="codeBlock" text="/** @jsx jsx */
import { jsx } from &apos;@emotion/react&apos;

render(
&lt;div
css={
backgroundColor: &apos;hotpink&apos;,
&apos;&amp;:hover&apos;: {
color: &apos;lightgreen&apos;
  }
}
 &gt;
    This has a hotpink background.
  &lt;/div&gt;
)
"><code><span class="hljs-comment">/** @jsx jsx */</span>
<span class="hljs-keyword">import</span> { <span class="hljs-title">jsx</span> } <span class="hljs-title"><span class="hljs-keyword">from</span></span> <span class="hljs-string">'@emotion/react'</span>

<span class="hljs-title">render</span>(
<span class="hljs-operator">&#x3C;</span><span class="hljs-title">div</span>
<span class="hljs-title">css</span><span class="hljs-operator">=</span>{
<span class="hljs-title">backgroundColor</span>: <span class="hljs-string">'hotpink'</span>,
<span class="hljs-string">'&#x26;:hover'</span>: {
<span class="hljs-title">color</span>: <span class="hljs-string">'lightgreen'</span>
  }
}
 <span class="hljs-operator">></span>
    <span class="hljs-title">This</span> <span class="hljs-title">has</span> <span class="hljs-title">a</span> <span class="hljs-title">hotpink</span> <span class="hljs-title">background</span>.
  <span class="hljs-operator">&#x3C;</span><span class="hljs-operator">/</span><span class="hljs-title">div</span><span class="hljs-operator">></span>
)
</code></pre><p>这种写法比起React自带的style的写法功能更强大，比如可以处理级联、伪类等style处理的不了的情况</p><pre data-type="codeBlock" text="&lt;span style=&gt;{keyword}&lt;/span&gt;
"><code><span class="hljs-operator">&#x3C;</span>span style<span class="hljs-operator">=</span><span class="hljs-operator">></span>{keyword}<span class="hljs-operator">&#x3C;</span><span class="hljs-operator">/</span>span<span class="hljs-operator">></span>
</code></pre><h2 id="h-" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0"></h2><p>JSS</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://cssinjs.org/?v=v10.6.0">https://cssinjs.org/?v=v10.6.0</a></p><p>阮一峰 <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.ruanyifeng.com/blog/2017/04/css_in_js.html">https://www.ruanyifeng.com/blog/2017/04/css_in_js.html</a> <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://polished.js.org/">https://polished.js.org/</a></p>]]></content:encoded>
            <author>specterv@newsletter.paragraph.com (Specter)</author>
        </item>
        <item>
            <title><![CDATA[My first article in mirror]]></title>
            <link>https://paragraph.com/@specterv/my-first-article-in-mirror</link>
            <guid>9e5a9WCCWTXNqWJRjTcQ</guid>
            <pubDate>Fri, 08 Oct 2021 06:52:56 GMT</pubDate>
            <description><![CDATA[Start to create happiness.Is notion in blockchain?]]></description>
            <content:encoded><![CDATA[<p>Start to create happiness.</p><h2 id="h-is-notion-in-blockchain" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Is notion in blockchain?</h2>]]></content:encoded>
            <author>specterv@newsletter.paragraph.com (Specter)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/32456936c2f19a148bb3af81c5fdad213c033d770eed64c011312a97f329e42a.jpg" length="0" type="image/jpg"/>
        </item>
    </channel>
</rss>