Sometimes in my free time, have you ever tried F12 to see how well-known website
they are designing html
tags, or play around with file js
on their products to see how they code?
For example, when F12 came to see google element
tags. Does anyone wonder as to why the class name tags are not defined by any rules =))
Or when looking at the js file of websites you often see the function definition is very miscellaneous
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="token keyword">function</span> <span class="token constant">P</span> <span class="token punctuation">(</span> e <span class="token punctuation">,</span> t <span class="token punctuation">,</span> o <span class="token punctuation">,</span> i <span class="token punctuation">)</span> <span class="token punctuation">{</span> o <span class="token punctuation">.</span> updateBound <span class="token operator">=</span> i <span class="token punctuation">,</span> window <span class="token punctuation">.</span> <span class="token function">addEventListener</span> <span class="token punctuation">(</span> <span class="token string">'resize'</span> <span class="token punctuation">,</span> o <span class="token punctuation">.</span> updateBound <span class="token punctuation">,</span> <span class="token punctuation">{</span> passive <span class="token punctuation">:</span> <span class="token operator">!</span> <span class="token number">0</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">var</span> r <span class="token operator">=</span> <span class="token function">n</span> <span class="token punctuation">(</span> e <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token constant">H</span> <span class="token punctuation">(</span> r <span class="token punctuation">,</span> <span class="token string">'scroll'</span> <span class="token punctuation">,</span> o <span class="token punctuation">.</span> updateBound <span class="token punctuation">,</span> o <span class="token punctuation">.</span> scrollParents <span class="token punctuation">)</span> <span class="token punctuation">,</span> o <span class="token punctuation">.</span> scrollElement <span class="token operator">=</span> r <span class="token punctuation">,</span> o <span class="token punctuation">.</span> eventsEnabled <span class="token operator">=</span> <span class="token operator">!</span> <span class="token number">0</span> <span class="token punctuation">,</span> o <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token constant">A</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> state <span class="token punctuation">.</span> eventsEnabled <span class="token operator">||</span> <span class="token punctuation">(</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> state <span class="token operator">=</span> <span class="token constant">P</span> <span class="token punctuation">(</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> reference <span class="token punctuation">,</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> options <span class="token punctuation">,</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> state <span class="token punctuation">,</span> <span class="token keyword">this</span> <span class="token punctuation">.</span> scheduleUpdate <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Of course, there must be a reason, but looking at the class name and debugging the code name there …
Reason
For modern applications, in addition to the application, it must pay attention to many factors such as speed, security, avoiding copying ideas …
Minify js
, css
or obfuscate
with class names will have the following advantages.
- Reduce the size of those js files, help clients load those files faster
- Hide the
source code
, avoid stealing ideas - Avoid using
extension
interfere with the UI - ….
Minify
How it works
Minify is a technique that uses certain npm
tools like uglify-js
, minifier
, babel-minify
to minimize your code.
The minimalist way, there are many methods such as shortening variable names, function names also a, b, C … remove trailing lines , spaces , index …
Or simply convert the following logic
1 2 3 4 5 | <span class="token comment">//Turn this</span> status <span class="token punctuation">:</span> <span class="token boolean">true</span> <span class="token comment">//Into this</span> status <span class="token punctuation">:</span> <span class="token operator">!</span> <span class="token number">0</span> |
As we can see, the word true
takes up to 4 characters , while !0
only takes 2 characters .
Sometimes I also wonder if there is a time when minify how the function has the same name ???
In fact, sometimes you seem to have functions that have the same name but are placed in different scope
so they are not affected.
You can test minify through some online sites, such as Uglify JS . We test the following simple code.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <span class="token keyword">function</span> <span class="token function">selectionSort</span> <span class="token punctuation">(</span> array <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">for</span> <span class="token punctuation">(</span> <span class="token keyword">let</span> i <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">;</span> i <span class="token operator"><</span> array <span class="token punctuation">.</span> length <span class="token operator">-</span> <span class="token number">1</span> <span class="token punctuation">;</span> i <span class="token operator">++</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> idmin <span class="token operator">=</span> i <span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token punctuation">(</span> <span class="token keyword">let</span> j <span class="token operator">=</span> i <span class="token operator">+</span> <span class="token number">1</span> <span class="token punctuation">;</span> j <span class="token operator"><</span> array <span class="token punctuation">.</span> length <span class="token punctuation">;</span> j <span class="token operator">++</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> array <span class="token punctuation">[</span> j <span class="token punctuation">]</span> <span class="token operator"><</span> array <span class="token punctuation">[</span> idmin <span class="token punctuation">]</span> <span class="token punctuation">)</span> idmin <span class="token operator">=</span> j <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// swap</span> <span class="token keyword">let</span> t <span class="token operator">=</span> array <span class="token punctuation">[</span> i <span class="token punctuation">]</span> <span class="token punctuation">;</span> array <span class="token punctuation">[</span> i <span class="token punctuation">]</span> <span class="token operator">=</span> array <span class="token punctuation">[</span> idmin <span class="token punctuation">]</span> <span class="token punctuation">;</span> array <span class="token punctuation">[</span> idmin <span class="token punctuation">]</span> <span class="token operator">=</span> t <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
After being minified, 68% size is saved
1 2 | <span class="token keyword">function</span> <span class="token function">selectionSort</span> <span class="token punctuation">(</span> t <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">for</span> <span class="token punctuation">(</span> <span class="token keyword">let</span> e <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">;</span> e <span class="token operator"><</span> t <span class="token punctuation">.</span> length <span class="token operator">-</span> <span class="token number">1</span> <span class="token punctuation">;</span> e <span class="token operator">++</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> l <span class="token operator">=</span> e <span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token punctuation">(</span> <span class="token keyword">let</span> n <span class="token operator">=</span> e <span class="token operator">+</span> <span class="token number">1</span> <span class="token punctuation">;</span> n <span class="token operator"><</span> t <span class="token punctuation">.</span> length <span class="token punctuation">;</span> n <span class="token operator">++</span> <span class="token punctuation">)</span> t <span class="token punctuation">[</span> n <span class="token punctuation">]</span> <span class="token operator"><</span> t <span class="token punctuation">[</span> l <span class="token punctuation">]</span> <span class="token operator">&&</span> <span class="token punctuation">(</span> l <span class="token operator">=</span> n <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">let</span> n <span class="token operator">=</span> t <span class="token punctuation">[</span> e <span class="token punctuation">]</span> <span class="token punctuation">;</span> t <span class="token punctuation">[</span> e <span class="token punctuation">]</span> <span class="token operator">=</span> t <span class="token punctuation">[</span> l <span class="token punctuation">]</span> <span class="token punctuation">,</span> t <span class="token punctuation">[</span> l <span class="token punctuation">]</span> <span class="token operator">=</span> n <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
When to minify
In fact, we only minify on production , I’ve seen some of you run npm run production
on local
(faceplam) …
Because simply improving the local file size does not solve the problem of the application, sometimes it is a double-edged sword, when minify it will be more difficult to debug the code.
To demonstrate that minify
helps reduce file size, we can test the following, for example, here I use Laravel
+ webpack
.
When run npm run dev
(No minify )
1 2 3 4 5 6 7 8 9 10 11 | <span class="token constant">DONE</span> Compiled successfully <span class="token keyword">in</span> <span class="token number">947</span> ms <span class="token number">4</span> <span class="token punctuation">:</span> <span class="token number">33</span> <span class="token punctuation">:</span> <span class="token number">13</span> <span class="token constant">PM</span> Asset Size Chunks Chunk Names <span class="token operator">/</span> css <span class="token operator">/</span> app <span class="token punctuation">.</span> css <span class="token number">208</span> KiB <span class="token punctuation">[</span> emitted <span class="token punctuation">]</span> <span class="token operator">/</span> css <span class="token operator">/</span> lp <span class="token punctuation">.</span> css <span class="token number">237</span> KiB <span class="token punctuation">[</span> emitted <span class="token punctuation">]</span> <span class="token operator">/</span> css <span class="token operator">/</span> reporter <span class="token punctuation">.</span> css <span class="token number">219</span> KiB <span class="token punctuation">[</span> emitted <span class="token punctuation">]</span> <span class="token operator">/</span> css <span class="token operator">/</span> reporter_homepage <span class="token punctuation">.</span> css <span class="token number">1.75</span> KiB mix <span class="token punctuation">[</span> emitted <span class="token punctuation">]</span> mix <span class="token operator">/</span> js <span class="token operator">/</span> app <span class="token punctuation">.</span> js <span class="token number">775</span> KiB <span class="token punctuation">[</span> emitted <span class="token punctuation">]</span> <span class="token operator">/</span> js <span class="token operator">/</span> lp <span class="token punctuation">.</span> js <span class="token number">257</span> KiB <span class="token punctuation">[</span> emitted <span class="token punctuation">]</span> <span class="token operator">/</span> js <span class="token operator">/</span> reporter <span class="token punctuation">.</span> js <span class="token number">582</span> KiB <span class="token punctuation">[</span> emitted <span class="token punctuation">]</span> |
When run npm run production
(Apply minify )
1 2 3 4 5 6 7 8 9 10 11 | <span class="token constant">DONE</span> Compiled successfully <span class="token keyword">in</span> <span class="token number">1763</span> ms <span class="token number">4</span> <span class="token punctuation">:</span> <span class="token number">33</span> <span class="token punctuation">:</span> <span class="token number">25</span> <span class="token constant">PM</span> Asset Size Chunks Chunk Names <span class="token operator">/</span> css <span class="token operator">/</span> app <span class="token punctuation">.</span> css <span class="token number">207</span> KiB <span class="token punctuation">[</span> emitted <span class="token punctuation">]</span> <span class="token operator">/</span> css <span class="token operator">/</span> lp <span class="token punctuation">.</span> css <span class="token number">229</span> KiB <span class="token punctuation">[</span> emitted <span class="token punctuation">]</span> <span class="token operator">/</span> css <span class="token operator">/</span> reporter <span class="token punctuation">.</span> css <span class="token number">216</span> KiB <span class="token punctuation">[</span> emitted <span class="token punctuation">]</span> <span class="token operator">/</span> css <span class="token operator">/</span> reporter_homepage <span class="token punctuation">.</span> css <span class="token number">1.41</span> KiB <span class="token number">0</span> <span class="token punctuation">[</span> emitted <span class="token punctuation">]</span> mix <span class="token operator">/</span> js <span class="token operator">/</span> app <span class="token punctuation">.</span> js <span class="token number">761</span> KiB <span class="token punctuation">[</span> emitted <span class="token punctuation">]</span> <span class="token operator">/</span> js <span class="token operator">/</span> lp <span class="token punctuation">.</span> js <span class="token number">210</span> KiB <span class="token punctuation">[</span> emitted <span class="token punctuation">]</span> <span class="token operator">/</span> js <span class="token operator">/</span> reporter <span class="token punctuation">.</span> js <span class="token number">577</span> KiB <span class="token punctuation">[</span> emitted <span class="token punctuation">]</span> |
Do you see the difference yet, remember to use minify
Obfuscate CSS class names
Before going into operation we have the following simple formula
Obfuscated CSS class names == Reduce file size == Reduce time to spread over the network.
Have you ever designed a button
with the class name as follows
<button class = “button button-color-red button – active”> title </button>
Obfuscate
can help make your class names simpler. Minimize characters as well as avoid the interference of extension
.
The CSS module solves the encapsulation problem in css, helping to redefine class names including class-name , scopce , and random hash functions . Class names can be defined using the localIdentName
attribute. For example [name]___[local]___[hash:base64:5]
Let’s take a real-world example when using CSS modules
with React
and Webpack
.
Button.css
1 2 3 4 5 6 7 8 9 10 11 | <span class="token punctuation">.</span> button <span class="token punctuation">{</span> font <span class="token operator">-</span> size <span class="token punctuation">:</span> <span class="token number">20</span> px <span class="token punctuation">;</span> color <span class="token punctuation">:</span> black <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">.</span> button <span class="token operator">--</span> color <span class="token operator">-</span> red <span class="token punctuation">{</span> color <span class="token punctuation">:</span> red <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">.</span> button <span class="token operator">--</span> active <span class="token punctuation">{</span> color <span class="token punctuation">:</span> green <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Button.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <span class="token keyword">import</span> React <span class="token keyword">from</span> <span class="token string">'react'</span> <span class="token punctuation">;</span> <span class="token keyword">import</span> PropTypes <span class="token keyword">from</span> <span class="token string">'prop-types'</span> <span class="token punctuation">;</span> <span class="token keyword">import</span> classNames <span class="token keyword">from</span> <span class="token string">'classnames/bind'</span> <span class="token punctuation">;</span> <span class="token keyword">import</span> styles <span class="token keyword">from</span> <span class="token string">'./css/Button.scss'</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> cx <span class="token operator">=</span> classNames <span class="token punctuation">.</span> <span class="token function">bind</span> <span class="token punctuation">(</span> styles <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> <span class="token function-variable function">Button</span> <span class="token operator">=</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> label <span class="token punctuation">,</span> color <span class="token punctuation">,</span> isActive <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">const</span> cssClasses <span class="token operator">=</span> <span class="token function">cx</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> <span class="token string">'button'</span> <span class="token punctuation">:</span> <span class="token boolean">true</span> <span class="token punctuation">,</span> <span class="token string">'button--color-red'</span> <span class="token punctuation">:</span> <span class="token punctuation">(</span> color <span class="token operator">===</span> <span class="token string">'primary'</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token string">'button--active'</span> <span class="token punctuation">:</span> isActive <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token punctuation">(</span> <span class="token operator"><</span> button className <span class="token operator">=</span> <span class="token punctuation">{</span> cssClasses <span class="token punctuation">}</span> <span class="token operator">></span> <span class="token punctuation">{</span> label <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> button <span class="token operator">></span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> Button <span class="token punctuation">.</span> propTypes <span class="token operator">=</span> <span class="token punctuation">{</span> label <span class="token punctuation">:</span> PropTypes <span class="token punctuation">.</span> string <span class="token punctuation">,</span> color <span class="token punctuation">:</span> PropTypes <span class="token punctuation">.</span> string <span class="token punctuation">,</span> isActive <span class="token punctuation">:</span> PropTypes <span class="token punctuation">.</span> bool <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token keyword">export</span> <span class="token keyword">default</span> Button <span class="token punctuation">;</span> |
webpack.config.js / loaders section
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <span class="token punctuation">{</span> test <span class="token punctuation">:</span> <span class="token regex">/.css$/</span> <span class="token punctuation">,</span> use <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> loader <span class="token punctuation">:</span> <span class="token string">'style-loader'</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> loader <span class="token punctuation">:</span> <span class="token string">'css-loader'</span> <span class="token punctuation">,</span> options <span class="token punctuation">:</span> <span class="token punctuation">{</span> modules <span class="token punctuation">:</span> <span class="token boolean">true</span> <span class="token punctuation">,</span> importLoaders <span class="token punctuation">:</span> <span class="token number">1</span> <span class="token punctuation">,</span> localIdentName <span class="token punctuation">:</span> <span class="token string">'[sha1:hash:hex:4]'</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> |
- The module attribute tells
webpack
that we need toobfuscated
class names . You should also set the attribute tofalse
during development for easydebug
. - The localIdentName attribute specifies the format of the class name after being obfuscation . As the above example we will specify the class name consists of 4 characters , endcode with sha1 .
Tadaaaaaaaaaaaa, this is the result.
summary
So I’ve just introduced two simple ways to minify and obfuscate the file
css
, js
and html
. For big companies like Google
and Facebook
they always apply these methods to improve their products. Or simply like Chatwork
has just applied the obfuscate
css technique, which makes it difficult for extension
like Chat++
to interfere with the UI.
Thank you for watching the article, if useful article remember me an upvote and follow me to produce more quality posts.
Reference: How to obfuscate CSS class names with React and Webpack