日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

UglifyJS中文文档

發(fā)布時間:2023/12/3 综合教程 55 生活家
生活随笔 收集整理的這篇文章主要介紹了 UglifyJS中文文档 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

UglifyJS中文文檔

譯者:李平海

轉載請注明原文鏈接(https://github.com/LiPinghai/... )與作者信息。

譯序

由于webpack本身集成了UglifyJS插件(webpack.optimize.UglifyJsPlugin),其命令webpack -p即表示調用UglifyJS來壓縮代碼,還有不少webpack插件如html-webpack-plugin也會默認使用UglifyJS。因此我們其實經常要用到它,但UglifyJS2本身配置較復雜/選項繁多,又沒有中文文檔,使用起來如墜云霧。鑒于此特翻譯此文,謬誤甚多,敬請斧正。

本文檔譯自UglifyJS2文檔。

另有UglifyJS3中文文檔在此

喜歡的話請收藏、給個贊/star吧!謝謝!

詞典:

parse       解釋
compress    壓縮
mangle      混淆
beautify    美化
minify      最小化
CLI         命令行工具
sourcemap   編譯后代碼對源碼的映射,用于網頁調試
AST         抽象語法樹
name        名字,包括變量名、函數名、屬性名
toplevel    頂層作用域
unreachable 不可達代碼
option      選項
STDIN       標準輸入,指在命令行中直接輸入
STDOUT      標準輸出
STDERR      標準錯誤輸出
side effects函數副作用,即函數除了返回外還產生別的作用,比如改了全局變量

以下為正文:

UglifyJS 2

UglifyJs 是一個js 解釋器、最小化器、壓縮器、美化器工具集(parser, minifier, compressor or beautifier toolkit)。

這個網頁是命令行使用的文檔,要看API和內部文檔請到UglifyJS作者的網站。
另外還有個在線demo(FF、chrome,safari可能也行)

注意:

  • uglify-js的發(fā)行版本只支持ES5,如果你要壓縮ES6+代碼請使用兼容開發(fā)分支
  • Node7有個已知的性能倒退問題——運行uglify-js兩次導致很慢

安裝

首先確認一直你已經安裝了最新的node.js(裝完后或許需要重啟一下電腦)

用NPM安裝CLI:

npm install uglify-js -g

用NPM下載給程序使用:

npm install uglify-js

用Git下載:

git clone git://github.com/mishoo/UglifyJS2.git
cd UglifyJS2
npm link 

使用

 uglifyjs [input files] [options]

UglifyJS2可以輸入多文件。建議你先寫輸入文件,再傳選項。UglifyJS會根據壓縮選項,把文件放在隊列中依次解釋。所有文件都會在同一個全局域中,假如一個文件中的變量、方法被另一文件引用,UglifyJS會合理地匹配。

假如你不要輸入文件,而是要輸入字符串(STDIN),那就把文件名換成一個橫線(-)

如果你想要把選項寫在文件名的前面,那要在二者之前加上雙橫線,防止文件名被當成了選項:

 uglifyjs --compress --mangle -- input.js

以下是可用的選項:

  --source-map                  指定輸出的文件產生一份sourcemap --source-map-root             此路徑中的源碼編譯后會產生sourcemap--source-map-url              放在//#sourceMappingURL的sourcemap路徑.  默認是 --source-map傳入的值.--source-map-include-sources  如果你要在sourcemap中加上源文件的內容作為sourcesContent屬性,就傳這個參數吧。--source-map-inline           把sourcemap以base64格式附在輸出文件結尾--in-source-map               輸入sourcemap。假如的你要編譯的JS是另外的源碼編譯出來的。假如該sourcemap包含在js內,請指定"inline"。--screw-ie8                   是否要支持IE6/7/8。UglifyJS默認不兼容IE。--support-ie8                 是否要支持IE6/7/8,等同于在`compress`, `mangle` 和`output`選項中都設置`screw_ie8: false`--expr                        編譯一個表達式,而不是編譯一段代碼(編譯JSON時用)-p, --prefix                  忽略sourcemap中源碼的前綴。例如`-p 3`會干掉文件名前面3層目錄以及保證路徑是相對路徑。你也可以指定`-p relative`,讓UglifyJS自己計算輸出文件、sourcemap與源碼之間的相對路徑。-o, --output                  輸出文件,默認標準輸出(STDOUT)-b, --beautify                美化輸出/指定輸出 選項-m, --mangle                  Mangle的名字,或傳入一個mangler選項.-r, --reserved                mangle的例外,不包含在mangling的名字-c, --compress                是否啟用壓縮功能(true/fasle),或者傳一個壓縮選項對象, 例如 `-c 'if_return=false,pure_funcs=["Math.pow","console.log"]'`,`-c`不帶參數的話就是用默認的壓縮設置。-d, --define                  全局定義-e, --enclose                 所有代碼嵌入到一個大方法中,傳入參數為配置項--comments                    保留版權注釋。默認保留Google Closure那樣的,保留JSDoc-style、包含"@license" 或"@preserve"字樣的注釋。你也可以傳下面的參數:- "all" 保留所有注釋- 正則(如`/foo/`、`/^!/`)保留匹配到的。要注意,如果啟用了壓縮,因為會移除不可達代碼以及壓縮連續(xù)聲明,因此不是*所有*注釋都能保留下來。--preamble                    在輸出文件開頭插入的前言。你可以插入一段注釋,例如版權信息。這些不會被編譯,但sourcemap會改成當前的樣子。--stats                       在STDERR中顯示操作運行時間。--acorn                       用 Acorn解析。--spidermonkey                假如輸入文件是 SpiderMonkey AST 格式(像JSON).--self                        把UglifyJS2本身也構建成一個依賴包(等同于`--wrap=UglifyJS --export-all`)--wrap                        所有代碼嵌入到一個大函數中,讓"exports"和"global"變量有效,你需要傳入一個參數指定模塊被瀏覽器引入時的名字。--export-all                  只當`--wrap`時有效,告訴UglifyJS自動把代碼暴露到全局。--lint                        顯示一些可視警告-v, --verbose                 Verbose-V, --version                 打印版本號.--noerr                       不要為-c,-b 或 -m選項中出現未知選項而拋出錯誤。--bare-returns                允許返回函數的外部。當最小化CommonJs模塊和Userscripts時,可能匿名函數會被.user.js引擎調用立即執(zhí)行(IIFE)--keep-fnames                 不要混淆、干掉的函數的名字。當代碼依賴Function.prototype.name時有用。--reserved-file               要保留的文件的名字--reserve-domprops            保留(絕大部分?)DOM的屬性,當--mangle-props--mangle-props                混淆屬性,默認是`0`.設置為`true`或`1`則會混淆所有屬性名。設為`unquoted`或 `2`則只混淆不在引號內的屬性。`2`時也會讓`keep_quoted_props` 美化選項生效,保留括號內的屬性;讓壓縮選項的`properties`失效,阻止覆寫帶點號(.)的屬性。你可以通過在命令中明確設置來覆寫它們。--mangle-regex                混淆正則,只混淆匹配到的屬性名。--name-cache                  用來保存混淆map的文件--pure-funcs                  假如返回值沒被調用則可以安全移除的函數。 例如`--pure-funcs Math.floor console.info`(需要設置 `--compress`)

指定--output (-o)來明確輸出文件,否則將在終端輸出(STDOUT)

sourcemap選項

Source map options

UglifyJS2可以生成一份sourcemap文件,這對調試你壓縮后的JS代碼非常有用。傳--source-map output.js.map(完整路徑)來獲取sorcemap文件。

另外,你可能要設置--source-map-root傳入源碼所在的根目錄。為了防止出現整個路徑,你可以用--prefix (-p)指定干掉幾層soucemap中路徑的前綴。

例如:

uglifyjs /home/doe/work/foo/src/js/file1.js \/home/doe/work/foo/src/js/file2.js \-o foo.min.js \--source-map foo.min.js.map \--source-map-root http://foo.com/src \-p 5 -c -m

上述配置會壓縮和混淆file1.jsfile2.js,輸出文件foo.min.js 和sourcemapfoo.min.js.map,sourcemap會建立http://foo.com/src/js/file1.js
http://foo.com/src/js/file2.js的映射。(實際上,sourcemap根目錄是http://foo.com/src,所以相當于源文件路徑是js/file1.jsjs/file2.js

關聯(lián)sourcemap

假如你的JS代碼是用其他編譯器(例如coffeescript)生成的,那么映射到JS代碼就沒什么用了,你肯定希望映射到CoffeeScript源碼。UglifyJS有一個選項可以輸入sourcemap,假如你有一個從CoffeeScript → 編譯后JS的map的話,UglifyJS可以生成一個從CoffeeScript->壓縮后JS的map映射到源碼位置。

你可以傳入 --in-source-map /path/to/input/source.map來嘗試此特性,如果sourcemap包含在js內,則寫--in-source-map inline 。通常輸入的sourcemap會指向源代碼生成的JS,所以你可以忽略不寫輸入文件。

混淆選項

Mangler options

你需要傳入--mangle (-m)來使啟用混淆功能。支持用逗號隔開選項:

  • toplevel — 混淆在最高作用域中聲明的變量名(默認disabled)
  • eval - 混淆在evalwith作用域出現的變量名(默認disabled)

當啟用混淆功能時,如果你希望保留一些名字不被混淆,你可以用--reserved (-r) 聲明一些名字,用逗號隔開。例如:

 uglifyjs ... -m -r '$,require,exports'

防止require, exports$被混淆改變。

混淆屬性名 (--mangle-props)

警告:這能會搞崩你的代碼。混淆屬性名跟混淆變量名不一樣,是相互獨立的。傳入--mangle-props會混淆對象所有可見的屬性名。例如:

var x = {foo: 1
};x.bar = 2;
x["baz"] = 3;
x[condition ? "moo" : "boo"] = 4;
console.log(x.something());

上面代碼中,foo, bar, baz, mooboo會被替換成單字符名字,something()則不變。

為了合理地使用,我們應該避免混淆一些JS標準的名字。比如,如果你代碼中有x.length = 10,那length就將被混淆,不管這是在對象中還是訪問數組的長度,它都被干掉。為了避免這種情況,你可以用 --reserved-file來輸入一個文件,里面包含不參與混淆的名字,變量名或屬性名都行。就像下面這樣:

{"vars": [ "define", "require", ... ],"props": [ "length", "prototype", ... ]
}

--reserved-file 可以是文件名數組(用逗號隔開,你也可以傳多個--reserved-file),在上面例子中的名字將被排除在混淆中。
tools/domprops.json 里有一個默認的排除名單,包括絕大部分標準JS和多種瀏覽器中的DOM屬性名。傳入--reserve-domprops 可以讀取此名單生效。

你也可以用正則表達式來定義一些應該被混淆的屬性名。例如--mangle-regex="/^_/",會只混淆以下劃線開始的屬性名。

當你壓縮多個文件時,為了保證讓它們最終能同時工作,我們要讓他們中同樣的屬性名混淆成相同的結果。傳入`--name-cache
filename.json`,UglifyJS會維護一個共同的映射供他們復用。這個json一開始應該是空的,例如:

rm -f /tmp/cache.json  # start fresh
uglifyjs file1.js file2.js --mangle-props --name-cache /tmp/cache.json -o part1.js
uglifyjs file3.js file4.js --mangle-props --name-cache /tmp/cache.json -o part2.js

現在,part1.jspart2.js會知曉對方混淆的屬性名。

假如你把所有文件壓縮成同一個文件,那就不需要啟用名字緩存了。

混淆括號中的名字(--mangle-props=unquoted--mangle-props=2)

使用括號屬性名 (o["foo"])以保留屬性名(foo)。這會讓整個腳本中其余此屬性的引用(o.foo)也不被混淆。例如:

$ echo 'var o={"foo":1, bar:3}; o.foo += o.bar; console.log(o.foo);' | uglifyjs --mangle-props=2 -mc
var o={"foo":1,a:3};o.foo+=o.a,console.log(o.foo);

調試屬性名混淆

為了混淆屬性時不至于完全糊涂,你可以傳入--mangle-props-debug來調試。例如o.foo會被混淆成o._$foo$_。這讓源碼大量、屬性被混淆時也可以debug,可以看清混淆會把哪些屬性搞亂。

你可以用--mangle-props-debug=XYZ來傳入自定義后綴。讓o.foo 混淆成 o._$foo$XYZ_, 你可以在每次編譯是都改變一下,來辨清屬性名怎么被混淆的。一個小技巧,你可以每次編譯時傳隨機數來模仿混淆操作(例如你更新了腳本,有了新的屬性名),這有助于識別混淆時的出錯。

壓縮器選項

Compressor options

你要傳入 --compress (-c)來啟用壓縮功能。你可以用逗號隔開選項。選項的形式為foo=bar,或者就foo(后者等同于你要設為true,相當于foo=true的縮寫)。

  • sequences(默認true) -- 連續(xù)聲明變量,用逗號隔開來。可以設置為正整數來指定連續(xù)聲明的最大長度。如果設為true 表示默認200個,設為false0則禁用。 sequences至少要是2,1的話等同于true(即200)。默認的sequences設置有極小幾率會導致壓縮很慢,所以推薦設置成20或以下。
  • properties -- 用.來重寫屬性引用,例如foo["bar"] → foo.bar
  • dead_code -- 移除沒被引用的代碼
  • drop_debugger -- 移除 debugger;
  • unsafe (默認 false) -- 使用 "unsafe"轉換 (下面詳述)
  • unsafe_comps (默認 false) -- 保留<<=不被換成 >>=。假如某些運算對象是用getvalueOfobject得出的時候,轉換可能會不安全,可能會引起運算對象的改變。此選項只有當 comparisonsunsafe_comps 都設為true時才會啟用。
  • unsafe_math (默認 false) -- 優(yōu)化數字表達式,例如2 * x * 3 變成 6 * x, 可能會導致不精確的浮點數結果。
  • unsafe_proto (默認 false) -- 把Array.prototype.slice.call(a) 優(yōu)化成 [].slice.call(a)
  • conditionals -- 優(yōu)化if等判斷以及條件選擇
  • comparisons -- 把結果必然的運算優(yōu)化成二元運算,例如!(a <= b) → a > b (只有設置了 unsafe_comps時才生效);盡量轉成否運算。例如 a = !b && !c && !d && !e → a=!(b||c||d||e)
  • evaluate -- 嘗試計算常量表達式
  • booleans -- 優(yōu)化布爾運算,例如 !!a? b : c → a ? b : c
  • loops -- 當dowhilefor循環(huán)的判斷條件可以確定是,對其進行優(yōu)化。
  • unused -- 干掉沒有被引用的函數和變量。(除非設置"keep_assign",否則變量的簡單直接賦值也不算被引用。)
  • toplevel -- 干掉頂層作用域中沒有被引用的函數 ("funcs")和/或變量("vars") (默認是false , true 的話即函數變量都干掉)
  • top_retain -- 當設了unused時,保留頂層作用域中的某些函數變量。(可以寫成數組,用逗號隔開,也可以用正則或函數. 參考toplevel)
  • hoist_funs -- 提升函數聲明
  • hoist_vars (默認 false) -- 提升 var 聲明 (默認是false,因為那會加大文件的size)
  • if_return -- 優(yōu)化 if/return 和 if/continue
  • join_vars -- 合并連續(xù) var 聲明
  • cascade -- 弱弱地優(yōu)化一下連續(xù)聲明, 將 x, x 轉成 xx = something(), x 轉成 x = something()
  • collapse_vars -- 當 varconst 單獨使用時盡量合并
  • reduce_vars -- 優(yōu)化某些變量實際上是按常量值來賦值、使用的情況。
  • warnings -- 當刪除沒有用處的代碼時,顯示警告
  • negate_iife -- 當立即執(zhí)行函數(IIFE)的返回值沒用時,取消之。避免代碼生成器會插入括號。
  • pure_getters -- 默認是 false. 如果你傳入true,UglifyJS會假設對象屬性的引用(例如foo.barfoo["bar"])沒有函數副作用。
  • pure_funcs -- 默認 null. 你可以傳入一個名字的數組,UglifyJS會假設這些函數沒有函數副作用。警告:假如名字在作用域中重新定義,不會再次檢測。例如var q = Math.floor(a/b),假如變量q沒有被引用,UglifyJS會干掉它,但 Math.floor(a/b)會被保留,沒有人知道它是干嘛的。你可以設置pure_funcs: [ 'Math.floor' ] ,這樣該函數會被認為沒有函數副作用,這樣整個聲明會被廢棄。在目前的執(zhí)行情況下,會增加開銷(壓縮會變慢)。
  • drop_console -- 默認 false. 傳true的話會干掉console.*函數。如果你要干掉特定的函數比如console.info ,又想刪掉后保留其參數中的副作用,那用pure_funcs來處理吧。
  • expression -- 默認 false。傳true來保留終端語句中沒有"return"的完成值。例如在bookmarklets。
  • keep_fargs -- 默認true。阻止壓縮器干掉那些沒有用到的函數參數。你需要它來保護某些依賴Function.length的函數。
  • keep_fnames -- 默認 false。傳 true來防止壓縮器干掉函數名。對那些依賴Function.prototype.name的函數很有用。延展閱讀:keep_fnames 混淆選項.
  • passes -- 默認 1。運行壓縮的次數。在某些情況下,用一個大于1的數字參數可以進一步壓縮代碼大小。注意:數字越大壓縮耗時越長。
  • keep_infinity -- 默認 false。傳true以防止壓縮時把1/0轉成Infinity,那可能會在chrome上有性能問題。

unsafe選項

在某些刻意營造的案例中,啟用某些轉換有可能會打斷代碼的邏輯,但絕大部分情況下是安全的。你可能會想嘗試一下,因為這畢竟會減少文件體積。以下是某些例子:

  • new Array(1, 2, 3)Array(1, 2, 3)[ 1, 2, 3 ]
  • new Object(){}
  • String(exp)exp.toString()"" + exp
  • new Object/RegExp/Function/Error/Array (...) → 我們干掉用new
  • typeof foo == "undefined"foo === void 0
  • void 0undefined (假如作用域中有一個變量名叫"undefined";我們這么做是因為變量名會被混淆成單字符)

編譯條件語句

Uglify會假設全局變量都是常量(不管是否在局部域中定義了),你可以用--define (-d)來實現定義全局變量。例如你傳--define DEBUG=false,UglifyJS會在輸出中干掉下面代碼:

if (DEBUG) {
console.log("debug stuff");
}

你可以像--define env.DEBUG=false這樣寫嵌套的常量。

在干掉那些永否的條件語句以及不可達代碼時,UglifyJS會給出警告。現在沒有選項可以禁用此特性,但你可以設置 warnings=false 來禁掉所有警告。

另一個定義全局常量的方法是,在一個獨立的文檔中定義,再引入到構建中。例如你有一個這樣的build/defines.js

const DEBUG = false;
const PRODUCTION = true;
// 等等

構建使用這樣寫:

  uglifyjs build/defines.js js/foo.js js/bar.js... -c

UglifyJS會注意到這些常量。因為它們無法改變,所以它們會被認為是沒被引用而被照樣干掉。如果你用const聲明,構建后還會被保留。如果你的運行環(huán)境低于ES6、不支持const,請用var聲明加上reduce_vars設置(默認啟用)來實現。

編譯條件語句API

你也可以通過程序API來設置編譯配置。其中有差別的是一個壓縮器屬性global_defs

uglifyJS.minify([ "input.js"], {compress: {dead_code: true,global_defs: {DEBUG: false}}
});

美化器選項

Beautifier options

代碼生成器默認會輸出盡量簡短的代碼。假如你想美化一下輸出代碼,請設置--beautify (-b)。你可以傳入更多可選的選項參數來控制代碼生成:

  • beautify (默認 true) -- 是否美化輸出代碼。傳-b的話就是設成true。假如你想生成最小化的代碼同時又要用其他設置來美化代碼,你可以設-b beautify=false
  • indent-level (默認 4) 縮進格數
  • indent-start (默認 0) -- 每行前面加幾個空格
  • quote-keys (默認 false) -- 傳true的話會在對象所有的鍵加上括號
  • space-colon (默認 true) -- 在冒號后面加空格
  • ascii-only (默認 false) -- 避免Unicode字符在字符串/正則中出現(非ascii字符會變不合法)。
  • inline-script (默認 false) -- 避免字符串中出現</script中的斜杠
  • width (默認 80) -- 僅在美化時生效,設定一個行寬讓美化器盡量實現。這會影響行中文字的數量(不包括縮進)。當前本功能實現得不是非常好,但依然讓美化后的代碼可讀性大大增強。
  • max-line-len (默認 32000) -- 最大行寬(壓縮后的代碼)
  • bracketize (默認 false) -- 永遠在if, for,do, while, with后面加上大括號,即使循環(huán)體只有一句。
  • semicolons (默認 true) -- 用分號分開多個聲明。如果你傳false,則總會另起一行,增強輸出文件的可讀性。(gzip前體積更小,gzip后稍大一點點)
  • preamble (默認 null) -- 如果要傳的話,必須是字符串。它會被加在輸出文檔的前面。sourcemap會隨之調整。例如可以用來插入版權信息。
  • quote_style (默認 0) -- 影響字符串的括號格式(也會影響屬性名和指令)。
  • 0 -- 傾向使用雙引號,字符串里還有引號的話就是單引號。
  • 1 -- 永遠單引號
  • 2 -- 永遠雙引號
  • 3 -- 永遠是本來的引號
  • keep_quoted_props (默認 false) -- 如果啟用,會保留屬性名的引號。

保留版權告示和其他注釋

你可以傳入--comments讓輸出文件中保留某些注釋。默認時會保留JSDoc-style的注釋(包含"@preserve","@license" 或 "@cc_on"(為IE所編譯))。你可以傳入--comments all來保留全部注釋,或者傳一個合法的正則來保留那些匹配到的注釋。例如--comments '/foo|bar/'會保留那些包含"foo" 或 "bar"的注釋。

注意,無論如何,總會有些注釋在某些情況下會丟失。例如:

function f() {/** @preserve Foo Bar */function g() {// this function is never called}return something();
}

即使里面帶有"@preserve",注釋依然會被丟棄。因為內部的函數g(注釋所依附的抽象語法樹節(jié)點)沒有被引用、會被壓縮器干掉。

書寫版權信息(或其他需要在輸出文件中保留的信息)的最安全位置是全局節(jié)點。

對SpiderMonkey的支持

UglifyJS2有自己的抽象語法樹格式;為了某些現實的原因
我們無法在內部輕易地改成使用SpiderMonkey抽象語法樹(AST)。但UglifyJS現在有了一個可以輸入SpiderMonkeyAST的轉換器。
例如Acorn ,這是一個超級快的生成SpiderMonkey AST的解釋器。它帶有一個實用的迷你CLI,能解釋一個文件、把AST轉存為JSON并標準輸出。可以這樣用UglifyJS來壓縮混淆:

    acorn file.js | uglifyjs --spidermonkey -m -c

--spidermonkey選項能讓UglifyJS知道輸入文件并非JavaScript,而是SpiderMonkey AST生成的JSON代碼。這事我們不用自己的解釋器,只把AST轉成我們內部AST。

使用 Acorn 來解釋代碼

更有趣的是,我們加了 --acorn選項來使用Acorn解釋所有代碼。如果你傳入這個選項,UglifyJS會require("acorn")

Acorn確實非常快(650k代碼原來要380ms,現在只需250ms),但轉換Acorn產生的SpiderMonkey樹會額外花費150ms。所以總共比UglifyJS自己的解釋器還要多花一點時間。

使用 UglifyJS 轉換 SpiderMonkey AST

現在你可以像使用其他中間工具一樣使用UglifyJS將JS抽象語法樹轉換為SpiderMonkey格式。

例如:

function uglify(ast, options, mangle) {// 把SpiderMonkey AST 轉成中間格式var uAST = UglifyJS.AST_Node.from_mozilla_ast(ast);// 壓縮uAST.figure_out_scope();uAST = UglifyJS.Compressor(options).compress(uAST);// 混淆 (可選)if (mangle) {uAST.figure_out_scope();uAST.compute_char_frequency();uAST.mangle_names();}// 轉回 SpiderMonkey ASTreturn uAST.to_mozilla_ast();
}

原博文有更多細節(jié)。

API參考

假如是通過NPM安裝的,你可以這樣在你的應用中加載UglifyJS:

var UglifyJS = require("uglify-js");

它會輸出很多模塊,但我在此只介紹一下涉及解釋、混淆和壓縮的基礎代碼。按(1)
解釋, (2) 壓縮, (3) 混淆, (4) 生成輸出代碼的順序。

簡易使用模式

minify是一個頂級的、單獨、包含所有步驟的方法。如果你不需要進一步自定義的話,你應該會喜歡使用它。

例子:

var result = UglifyJS.minify("/path/to/file.js");
console.log(result.code); // 最小化輸出
// 假如你不想傳一個文件名,而是要傳入一段代碼
var result = UglifyJS.minify("var b = function () {};", {fromString: true});

你也可以壓縮多個文件:

var result = UglifyJS.minify([ "file1.js", "file2.js", "file3.js" ]);
console.log(result.code);

這樣生成一份sourcemap:

var result = UglifyJS.minify([ "file1.js", "file2.js", "file3.js" ], {outSourceMap: "out.js.map"
});
console.log(result.code); // 最小化輸出
console.log(result.map);

你也可以用一個帶fromString選項的對象來要生成sourcemap:

var result = UglifyJS.minify({"file1.js": "var a = function () {};"}, {outSourceMap: "out.js.map",outFileName: "out.js",fromString: true
});

要注意,此時sourcemap并不會保存為一份文件,它只會返回在result.map中。outSourceMap 的值只用來在result.code中設置//# sourceMappingURL=out.js.mapoutFileName 的值只用來在sourcemap文件中設置 file屬性。

sourcemap(查閱規(guī)格)中的file屬性會優(yōu)先使用 outFileName ,假如沒有,會從outSourceMap中推導(就是去掉'.map')。

你可以把sourceMapInline設為true ,這樣sourcemap會加在代碼末尾。

你也可以指定sourcemap中的源文件根目錄(sourceRoot)屬性:

var result = UglifyJS.minify([ "file1.js", "file2.js", "file3.js" ], {outSourceMap: "out.js.map",sourceRoot: "http://example.com/src"
});

如果你要壓縮從其他文件編譯得來的帶一份sourcemap的JS文件,你可以用inSourceMap參數:

var result = UglifyJS.minify("compiled.js", {inSourceMap: "compiled.js.map",outSourceMap: "minified.js.map"
});
// 跟之前一樣,返回 `code`和 `map`

如果你要輸入的sourcemap并非一份單獨文件,你可以在對象參數中設置inSourceMap參數:

var result = UglifyJS.minify("compiled.js", {inSourceMap: JSON.parse(my_source_map_string),outSourceMap: "minified.js.map"
});

只有在需要outSourceMap時, inSourceMap 才會被用到(否則就沒用咯)。

要設置sourcemap的url的話,請用 sourceMapUrl選項。

如果你要用 X-SourceMap 請求頭,你可以把sourceMapUrl選項設為false。
outSourceMap的默認設置:

var result = UglifyJS.minify([ "file1.js" ], {outSourceMap: "out.js.map",sourceMapUrl: "localhost/out.js.map"
});

其他選項:

  • warnings (默認 false) — 傳true來現實壓縮器的警告
  • fromString (默認 false) — 傳true的話,你可以輸入JS源碼,而不是文件名。
  • mangle (默認 true) — 傳false來跳過混淆步驟,或者傳一個對象來特定指明混淆選項(下面詳述)。
  • mangleProperties (默認 false) — 傳一個對象來自定義指明混淆對象屬性的選項。
  • output (默認 null) — 如果你要進一步指定輸出選項,請傳一個對象。默認是壓縮到最優(yōu)化。
  • compress (默認 {}) — 傳false的話就跳過整個壓縮步驟。自定義的話請傳一個壓縮選項對象。
  • parse (默認 {}) — 如果你要進一步自定義解釋步驟請傳一個解釋選項對象(不是所有選項都有效....下面再說)。

混淆

  • except - 傳一個應該排除在混淆之外的標識的數組。

    • toplevel — 混淆那些定義在頂層作用域的名字(默認禁用)。
    • eval — 混淆那些在with或eval中出現的名字(默認禁用)。
    • keep_fnames -- 默認false。傳true的話就不混淆函數名。對那些依賴Function.prototype.name的代碼有用。延展閱讀:keep_fnames 壓縮選項.

例子:

  //tst.jsvar globalVar;function funcName(firstLongName, anotherLongName){var myVariable = firstLongName +  anotherLongName;}UglifyJS.minify("tst.js").code;// 'function funcName(a,n){}var globalVar;'UglifyJS.minify("tst.js", { mangle: { except: ['firstLongName'] } }).code;// 'function funcName(firstLongName,a){}var globalVar;'UglifyJS.minify("tst.js", { mangle: { toplevel: true } }).code;// 'function n(n,a){}var a;'

混淆屬性名選項

  • regex — 傳一個正則,僅混淆匹配到的名字。(與--mangle-regex CLI參數選項關聯(lián))
  • ignore_quoted – 只混淆非括號中的屬性名(與--mangle-props 2 CLI 參數選項關聯(lián))
  • debug – 讓混淆后的名字與原名字有關。與--mangle-props-debug CLI 參數選項關聯(lián))。默認是false。傳一個空字符串來啟用,或者傳一個非空字符串來添加后綴。

高級使用模式

如果minify函數太簡單不能滿足你的需求,下面這些API信息有更多的細節(jié)詳情:

解釋器

var toplevel_ast = UglifyJS.parse(code, options);

options 是可選的,要傳的話就必須傳個對象。下面這些是有效的屬性:

  • strict — 禁用自動添加分號,禁止數組、對象末尾還有逗號。
  • bare_returns — 允許函數返回外部。(與 --bare-returns CLI參數選項關聯(lián),對minify parse選項對象也有效。)
  • filename — 輸入的文件名。
  • toplevel — 一個 toplevel 節(jié)點。 (就是之前調用parse返回的)

后面兩個選項是當你要最小化多個文件成一個文件(以及正確的sourcemap)時有用。我們的CLI會像這樣處理:

var toplevel = null;
files.forEach(function(file){var code = fs.readFileSync(file, "utf8");toplevel = UglifyJS.parse(code, {filename: file,toplevel: toplevel});
});

完成后,我們就在toplevel這個大AST里包含了我們的所有文件,每一份都帶著正確的來源信息。

作用域信息

UglifyJS包含一個作用域分析器,你可以在壓縮、混淆前手動調用。基本上,它添加了AST中的節(jié)點在哪里被命名、被引用了多少次、是否全局的、是否在evalwith中聲明等等。我們將討論除此之外的,那些在你對AST進行任何操作前必須知道的重要事項:

toplevel.figure_out_scope()

壓縮

就如這樣:

var compressor = UglifyJS.Compressor(options);
var compressed_ast = compressor.compress(toplevel);

options可以不要。之前的“壓縮器選項“中已經講過可以填什么。默認選項對大多數腳本來說應該都是最佳的。

壓縮器是破壞性的,所以不要依賴那些源樹toplevel

混淆

壓縮之后再調用一次figure_out_scope是個好做法(因為壓縮過程可能會干掉一些沒用的、不可達的代碼,改變標識的數量和位置),你也可以選擇在Gzip(統(tǒng)計不可混淆的詞中字符的使用頻率)后調用。例如:

compressed_ast.figure_out_scope();
compressed_ast.compute_char_frequency();
compressed_ast.mangle_names();

生成輸出代碼

AST節(jié)點帶一個print方法,用來生成輸出流。基本上,要生成代碼你只要這么做:

var stream = UglifyJS.OutputStream(options);
compressed_ast.print(stream);
var code = stream.toString(); // 這就是你最小化后的代碼

又或者這樣縮寫:

var code = compressed_ast.print_to_string(options);

通常情況下options是可選的。輸出流可以接收一堆選項參數,絕大多數在”美化選項“中有闡述。我們所關心的是source_mapcomments選項。

在輸出代碼中保留注釋

你需要傳入comments選項來保留某些注釋。你可以傳正則表達式(以/包裹或正則對象)、布爾值或函數。也可以傳字符串allsomesome等同于CLI中--comments不帶任何參數。如果你傳正則,只有匹配到的注釋會被保留。注意,匹配的主體不包括 ///*。如果你傳函數,每遇到樹中的注釋都會調用一下,傳入兩個參數,一是注釋所依附的節(jié)點,二是注釋標識本身。

注釋標識有如下屬性:

  • type: 單行注釋是"comment1",多行注釋 "comment2"。
  • value: 注釋體本身。
  • posendpos: 注釋在源碼中出現的起始位置/結束位置(從0開始索引)。
  • linecol: 注釋在源碼中出現的行和列。
  • file — 源碼的文件名
  • nlb — 在源碼中,如果注釋前有一空行或注釋另起新一行的話是true

你的函數返回true的話就保留注釋,其他返回值都代表false。

生成sourcemap

你需要在調用print時傳source_map參數。source_map參數需要是SourceMap對象(在source-map庫頂部有個小框框里說了)。

例子:

var source_map = UglifyJS.SourceMap(source_map_options);
var stream = UglifyJS.OutputStream({...source_map: source_map
});
compressed_ast.print(stream);var code = stream.toString();
var map = source_map.toString(); // 輸出json格式sourcemap

source_map_options(可選)包含以下屬性:

  • file: 被輸出的、sourcemap所映射的JS的文件名
  • root: sourceRoot 屬性 (詳看 規(guī)格)
  • orig: "original source map",方便你想讓sourcemap映射到生成JS的源碼上。此參數可以只是字符串或json,也可以是包含源碼sourcemap的json對象。

兼容版

Harmony

如果你想使用能最小化ES6+的實驗性質的兼容分支,請在你的package.json 文件中加上下面代碼:

"uglify-js": "git+https://github.com/mishoo/UglifyJS2.git#harmony"

或者直接安裝兼容實驗版UglifyJS:

npm install --save-dev uglify-js@github:mishoo/UglifyJS2#harmony

更多細節(jié)請看 #448

總結

以上是生活随笔為你收集整理的UglifyJS中文文档的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

91最新网址| 激情自拍av | 麻豆果冻剧传媒在线播放 | 狠狠躁天天躁 | 国产精品久久久久久久久久东京 | 久久精品导航 | 91色亚洲 | 97在线观看视频国产 | 美女久久久久久久久久久 | 在线观看精品黄av片免费 | 激情视频一区二区三区 | 亚洲精品男女 | 色99视频 | 国产麻豆精品一区二区 | 开心色婷婷 | 亚洲精品午夜久久久久久久久久久 | 久久精品最新 | 91粉色视频 | 久久中文字幕导航 | 国产精品女同一区二区三区久久夜 | 亚洲精品在线视频观看 | 黄色网在线免费观看 | 美女一区网站 | 黄色日本免费 | 国产高清精品在线 | 天堂激情网 | 亚洲精品在 | 久久一区二区三区超碰国产精品 | 亚洲91精品 | 亚洲一区黄色 | 色综合久久久久网 | 午夜av日韩| 亚洲天堂网在线视频观看 | 国产成人一二片 | 国产精品第7页 | 国产一区不卡在线 | 天天躁天天操 | 成人av影视在线 | 97在线精品视频 | 久久久久在线 | 免费黄色网址网站 | 九热精品| 日本久久中文字幕 | 99爱在线观看 | 91精品91 | 国产精品99久久免费观看 | 亚洲成色777777在线观看影院 | 久久国产精品影片 | 国产精品99久久久久久宅男 | 国产第一页福利影院 | 亚洲年轻女教师毛茸茸 | 久久久久久久久久电影 | 中文字幕在线观看一区二区 | 免费观看国产精品视频 | 九九热精品在线 | 成人在线免费看视频 | 精品九九久久 | 激情综合色图 | 97人人模人人爽人人喊中文字 | 国产女人40精品一区毛片视频 | www激情久久 | 亚洲国产剧情 | 日本久久久久 | 2018亚洲男人天堂 | 麻豆免费看片 | 人人爱爱| 欧美成人猛片 | 丁香午夜婷婷 | 精品乱码一区二区三四区 | 在线一二区 | 国产在线理论片 | 色网站在线 | 毛片一级免费一级 | 成人cosplay福利网站 | 免费a视频| 日韩va欧美va亚洲va久久 | 狠狠干夜夜操 | 精品v亚洲v欧美v高清v | 婷婷色av | www.久久久com | 欧美日韩三级在线观看 | 国产夫妻av在线 | av免费看av | 国内综合精品午夜久久资源 | 一区二区三区电影大全 | 久久99久国产精品黄毛片入口 | 99久久久国产精品 | 久久这里精品视频 | 免费在线观看中文字幕 | 日韩高清一区 | 人人干在线 | 久久久性 | 日日插日日干 | 亚洲三级网 | 国产中文视| 少妇18xxxx性xxxx片 | 69久久99精品久久久久婷婷 | 精品在线播放 | 天天综合天天综合 | 色噜噜日韩精品欧美一区二区 | 国产破处在线视频 | 在线精品视频在线观看高清 | 国产精品久久久久久av | 在线观看成人毛片 | 午夜精品久久久久久久99婷婷 | 伊人婷婷色 | 狠狠干美女| 激情av资源网 | 97超碰人人澡 | 日韩欧美99| 久久久久久久国产精品 | 美女免费视频黄 | 亚洲午夜久久久久久久久电影网 | 亚洲一区美女视频在线观看免费 | 天天干人人 | 久久黄色a级片 | 狠狠色丁香婷婷 | 久久精品亚洲一区二区三区观看模式 | 欧美另类v | 成人av.com | 四虎国产视频 | 成人毛片一区 | 开心激情综合网 | 久久久久久免费网 | 91精品国产综合久久婷婷香蕉 | 精品一区 精品二区 | 久久国产女人 | 九九精品久久久 | 99这里只有精品视频 | 欧美网站黄色 | 午夜在线观看一区 | 超碰在线天天 | 黄色资源在线 | 色av色av色av | 国产视频精品在线 | 久久露脸国产精品 | 久久综合婷婷综合 | 最近日本中文字幕a | 深夜男人影院 | 久久99亚洲精品久久 | 国产精品久久久久久久av电影 | 五月婷婷综合在线观看 | 中文字幕在线一二 | 美女网站免费福利视频 | 免费看一级片 | 亚洲国产精品电影 | 伊人干综合 | 日本黄色免费观看 | 99一区二区三区 | 婷婷六月天丁香 | 日韩精品久久一区二区三区 | 久久精品国产一区二区电影 | 久久久久久免费毛片精品 | 日韩黄色免费在线观看 | 欧美成人tv| 天天躁日日躁狠狠躁av麻豆 | 亚洲精品资源 | 成年人免费av网站 | 亚洲国产美女精品久久久久∴ | 黄色片亚洲 | 99热99| 亚洲一级片av| 日韩高清在线看 | 欧美成人猛片 | 国产一线天在线观看 | 最新中文字幕在线播放 | 日本在线观看中文字幕无线观看 | 伊人五月综合 | 在线黄色免费av | 国产午夜精品福利视频 | 国产在线最新 | 色偷偷888欧美精品久久久 | 日韩动态视频 | 成年人在线播放视频 | 久久久久久久久综合 | 少妇视频在线播放 | 91麻豆看国产在线紧急地址 | 日日碰狠狠添天天爽超碰97久久 | 日操操 | 国产原创中文在线 | 在线电影av | 天天操天天艹 | 91成人精品一区在线播放 | 国产成人免费在线观看 | 国产小视频在线观看 | 国产精品1000 | 国产一二三在线视频 | 在线 你懂 | 久艹在线播放 | 国产一级久久 | 亚洲精品国产第一综合99久久 | 天天曰 | 中文字幕 国产视频 | 99久久精品免费看国产四区 | 久久国产成人午夜av影院宅 | 香蕉久草在线 | 四虎影视欧美 | 91精品久久久久久久久 | 五月天综合网站 | 日日干夜夜操视频 | 黄色一级免费电影 | 在线看片91 | 91看成人 | 日韩高清dvd | 国产精品麻豆免费版 | 久久日韩精品 | 91精品久久久久久久久久久久久 | 丝袜一区在线 | 成人午夜在线电影 | 黄色毛片大全 | 欧美淫视频 | 99精品视频免费看 | 日韩精品黄 | 国产精品 中文在线 | 亚洲日日夜夜 | 黄色电影在线免费观看 | 在线观看日本高清mv视频 | 国产精品 久久 | 91精品啪在线观看国产 | 在线观看视频你懂的 | 国产精品久久久免费 | 久久精品高清 | 99视频偷窥在线精品国自产拍 | 亚洲国产成人久久综合 | 91成人免费观看视频 | 国产日韩欧美网站 | 午夜精品久久一牛影视 | 黄色软件在线观看免费 | 色悠悠久久综合 | 中文在线www | 国产精品高潮呻吟久久久久 | 日躁夜躁狠狠躁2001 | 欧美色图88| 中文字幕在线观看第一页 | 久久66热这里只有精品 | 亚洲狠狠婷婷综合久久久 | 亚洲 欧洲 国产 日本 综合 | 免费能看的av | 国产亚洲精品女人久久久久久 | 国产精品久久久久久久久久东京 | 成人97人人超碰人人99 | 99性视频 | 爱干视频 | 在线精品视频在线观看高清 | 在线观看日本韩国电影 | 免费日韩三级 | 最近免费中文字幕大全高清10 | 天天操福利视频 | 国产精品视频不卡 | 国内精品二区 | 国产亚洲综合性久久久影院 | 日本aaaa级毛片在线看 | 91av在线视频播放 | 日韩专区在线观看 | 久久五月天色综合 | 最近日本韩国中文字幕 | 一本一道波多野毛片中文在线 | 免费高清在线观看成人 | av片中文 | 激情久久伊人 | 97在线免费 | 免费观看的黄色片 | 久久久国产一区二区三区 | 日韩午夜精品 | 91激情视频在线 | 免费美女久久99 | 免费男女羞羞的视频网站中文字幕 | 人人爱人人射 | 国产一区av在线 | 香蕉成人在线视频 | 四虎影视欧美 | 91成人在线观看喷潮 | 蜜桃麻豆www久久囤产精品 | 99精品视频免费观看 | 久久综合五月婷婷 | 成人av电影免费观看 | 成片免费观看视频大全 | 亚洲精品网站 | 美女久久久久 | 亚洲经典中文字幕 | 久久精品免费观看 | 婷婷亚洲五月色综合 | 成人污视频在线观看 | 六月婷色 | 中文字幕av一区二区三区四区 | 最近中文国产在线视频 | 久久麻豆视频 | 国产小视频国产精品 | 久草视频在线看 | 国产精品久久久久久妇 | 中文字幕一区二区三区四区在线视频 | 在线视频 日韩 | 久久午夜影视 | 国产五十路毛片 | 五月天中文字幕mv在线 | 欧美成人性战久久 | 天天操人人干 | 99视频在线观看一区三区 | 最近免费中文字幕mv在线视频3 | 看国产黄色大片 | 中文字幕视频观看 | 在线三级播放 | 大荫蒂欧美视频另类xxxx | 精品国产自在精品国产精野外直播 | 久操免费视频 | 久久综合综合久久综合 | 国产免费作爱视频 | 日韩成人精品在线观看 | 97视频在线免费播放 | 91精品视频在线播放 | a在线免费观看视频 | 久久精品—区二区三区 | 欧美日韩在线播放 | 96国产精品| 婷婷av色综合 | 日日夜夜婷婷 | 成年人视频在线观看免费 | 国产高清免费在线观看 | 在线观看视频福利 | 亚洲精品在线观看视频 | 超碰在线观看av.com | 日本精品中文字幕 | 国产专区精品视频 | 免费av电影网站 | av在线免费观看网站 | 精品国模一区二区三区 | 国产色区 | 91精品国产成人 | 亚洲亚洲精品在线观看 | 黄色一级大片在线免费看国产一 | 久久久亚洲国产精品麻豆综合天堂 | 伊人中文字幕在线 | 亚洲精品五月天 | 中文字幕精 | 久草在线欧美 | 在线观看国产日韩 | 一区二区三区 中文字幕 | 男女啪啪网站 | 黄污网| www.av在线.com| 色婷婷狠狠18 | 九色激情网 | 免费观看成人网 | 亚洲 欧洲 国产 日本 综合 | 在线观看亚洲免费视频 | 日韩中文字幕国产精品 | 免费日韩精品 | 成人一区二区在线观看 | 国产一级一片免费播放放a 一区二区三区国产欧美 | 狂野欧美激情性xxxx欧美 | 日韩成人中文字幕 | 日韩最新理论电影 | 欧美成人精品欧美一级乱黄 | 女人魂免费观看 | 精品一区二区三区久久 | 狠狠狠狠狠干 | 日韩欧美综合在线视频 | 一区二区三区免费在线观看视频 | 亚洲最新av网址 | 毛片网站在线看 | 在线观看午夜 | 午夜精品久久久久久久99 | 亚洲 欧洲av| 99色99| 日日操日日插 | 五月天色综合 | 丰满少妇在线观看资源站 | 一区二区三区福利 | 免费99视频 | 色综合久久88色综合天天 | 天天看天天干 | 国产精品中文在线 | 国产精品永久免费在线 | 中文字幕精品久久 | 色97在线| 在线观看亚洲a | 欧美日韩一区二区久久 | 久久久在线视频 | 国产一区在线看 | 中文字幕一区三区 | 成人免费网站在线观看 | 视频福利在线 | 中文字幕在线观看视频一区二区三区 | 日韩免费高清 | 成人黄色电影在线播放 | 97碰碰碰| 亚洲另类交 | 天天干天天操av | 狠狠躁18三区二区一区ai明星 | 久久夜色精品国产欧美一区麻豆 | 久久99热这里只有精品 | 精品国产一区二区三区久久久 | 又黄又爽又湿又无遮挡的在线视频 | 国产精品原创av片国产免费 | 在线成人看片 | 婷婷免费在线视频 | 97成人精品区在线播放 | 在线观看mv的中文字幕网站 | 日本中文字幕电影在线免费观看 | 综合婷婷 | 国产精品手机在线 | 久久九九精品 | 在线天堂日本 | 91精品在线视频观看 | 99热精品久久 | 午夜 久久 tv | 日韩成年视频 | 天天干天天拍天天操 | 欧美一区二区精品在线 | 久久免费国产视频 | 国产一区二区三精品久久久无广告 | 成人精品在线 | 国产打女人屁股调教97 | 久久视频免费看 | 毛片网站在线观看 | 国产无限资源在线观看 | 国产糖心vlog在线观看 | 成人禁用看黄a在线 | 综合五月婷婷 | 免费在线观看av不卡 | japanesexxxhd奶水 91在线精品一区二区 | 久久久久久久影院 | 久久亚洲影视 | 国产成人在线一区 | 不卡av免费在线观看 | 国产精品一区二区三区视频免费 | 欧美与欧洲交xxxx免费观看 | 亚洲精品免费在线视频 | 欧美片一区二区三区 | 欧美经典久久 | 91成人网在线播放 | 日韩视频一二三区 | 免费观看一级一片 | 色www. | 日韩成人中文字幕 | 中文字幕高清在线 | 免费a级毛片在线看 | 国产一级二级三级视频 | 欧美一级片免费观看 | 四虎精品成人免费网站 | 免费观看国产精品 | 亚州激情视频 | av资源网在线播放 | 国产福利在线免费观看 | 欧美精品小视频 | 国产精品久久久久久一区二区三区 | 激情综合站 | 精品在线视频观看 | 亚洲开心激情 | av成人免费 | 狠狠色丁香久久婷婷综合五月 | 久久精品一区二区三区中文字幕 | 欧美吞精 | avav99| 日韩va在线观看 | 福利视频网站 | 日日天天av| 在线看国产视频 | 美国三级黄色大片 | 欧美激情第十页 | 日韩在线视频不卡 | 亚洲第一区精品 | 久久99视频免费观看 | 成人三级av | 免费观看丰满少妇做爰 | 亚洲人天堂 | 日韩中文字幕免费看 | 欧美日韩3p | 欧美大片在线看免费观看 | 中文字幕网站视频在线 | 特级西西444www大精品视频免费看 | 天天草天天插 | 国产一级性生活 | 91精品人成在线观看 | 国产日本亚洲 | 精品国产福利在线 | 久久久久久美女 | 国产打女人屁股调教97 | 又长又大又黑又粗欧美 | 色九九影院 | 免费能看的av | 天堂久久电影网 | 久草在线资源网 | 久久国产福利 | 久久激情视频 久久 | 欧美五月婷婷 | 精品一二区 | 蜜桃av人人夜夜澡人人爽 | 国产精品麻豆99久久久久久 | 香蕉网在线| 久久婷综合 | 亚洲精品乱码久久久久久蜜桃动漫 | 日日激情 | 久久午夜免费视频 | 四虎影视成人永久免费观看亚洲欧美 | 97精品在线 | 午夜12点| 久久试看 | 黄色视屏免费在线观看 | 毛片视频电影 | 婷婷激情综合五月天 | 日本性高潮视频 | 狠狠干狠狠久久 | 五月天堂网 | 国产美女久久 | 亚洲免费av在线播放 | 9在线观看免费高清完整版在线观看明 | 黄色影院在线免费观看 | 中文国产字幕在线观看 | 久久精品欧美视频 | 激情网五月天 | 日韩激情久久 | av免费观看高清 | 9在线观看免费高清完整版在线观看明 | 久久综合久久综合久久 | 色婷婷综合久色 | 精品一区电影 | 精品久久久久久久久久 | 国产精品短视频 | 操操爽| 97免费| 欧美精品做受xxx性少妇 | 精品视频在线播放 | 国产高清免费av | 亚洲欧美精品一区二区 | 国产精品在线看 | 亚洲国产婷婷 | 久久成年人视频 | 在线看国产日韩 | 综合激情婷婷 | 麻豆精品传媒视频 | 色久网| 深夜福利视频在线观看 | 麻豆91精品 | 国产精品爽爽久久久久久蜜臀 | 又黄又刺激的网站 | 久久久亚洲国产精品麻豆综合天堂 | 狠狠躁天天躁综合网 | 很黄很黄的网站免费的 | 日韩资源在线观看 | 欧美日韩精品在线播放 | 国产色影院 | 欧美午夜性 | 国产成人无码AⅤ片在线观 日韩av不卡在线 | 综合网在线视频 | 日产乱码一二三区别免费 | 九九热re | 久久人人爽人人爽人人片av免费 | 亚洲 综合 国产 精品 | 东方av免费在线观看 | 五月天综合激情网 | 午夜精品一区二区三区在线观看 | 亚洲aⅴ在线 | 婷婷在线看 | 国产永久免费观看 | 在线亚洲免费视频 | 久久视频这里只有精品 | 欧美性做爰猛烈叫床潮 | 91av资源网 | 在线三级播放 | 久久久久久高潮国产精品视 | 久久人人97超碰精品888 | 婷婷网站天天婷婷网站 | 欧美日韩国产精品一区二区亚洲 | 久操中文字幕在线观看 | 玖玖视频网 | 国产在线色| 91完整版在线观看 | 在线亚洲高清视频 | 国产精品嫩草影院123 | 激情综合五月婷婷 | 亚洲天堂视频在线 | 国产精品美女久久久久久久久久久 | 精品国产一区在线观看 | 99在线视频网站 | 欧美韩国日本在线观看 | 操操操av| 极品嫩模被强到高潮呻吟91 | 麻豆成人精品视频 | 女人18毛片a级毛片一区二区 | 97视频在线观看视频免费视频 | 日日日日日 | a黄色大片 | 国产一区二区三区网站 | 欧美极品一区二区三区 | 亚洲国产精品资源 | 天天摸天天操天天爽 | 久久字幕精品一区 | 99c视频高清免费观看 | 天天操天天色综合 | 一区二区视频播放 | 亚洲国产精品电影在线观看 | 天天艹天天操 | 亚洲在线网址 | 亚洲精品国产精品国自产观看浪潮 | 狠狠狠色丁香婷婷综合久久五月 | 91精品国产综合久久福利不卡 | 黄色三级网站在线观看 | 免费看污污视频的网站 | 精品免费在线视频 | 天天干天天干天天干天天干天天干天天干 | 国产成人三级在线播放 | 韩国视频一区二区三区 | 9999激情| 91精品久久久久久久久久久久久 | 97人人射 | 天天天色综合a | 免费观看福利视频 | 久久亚洲免费视频 | 免费看的黄色 | 一区二区三区手机在线观看 | 国产区精品区 | 伊人午夜视频 | 91丨精品丨蝌蚪丨白丝jk | 曰韩在线 | 精品uu | 国产视频中文字幕在线观看 | 亚洲韩国一区二区三区 | h文在线观看免费 | 日韩午夜大片 | 九九日九九操 | 久久精品影视 | 色综合天天综合在线视频 | 九九视频免费在线观看 | 国产精品一区二区免费 | 特级西西人体444是什么意思 | 国产一级免费在线 | 少妇高潮流白浆在线观看 | 青青草国产精品视频 | 久草精品电影 | av在线免费在线观看 | 91麻豆精品国产91久久久无限制版 | 在线观看免费黄色 | 亚洲精品国产日韩 | 91成年人视频 | 久久久久国产精品一区 | 久久视频 | 精品久久影院 | 在线视频婷婷 | 国产原创91 | 国产精品自产拍在线观看中文 | 超碰97人人在线 | 久草在线中文888 | 国内视频在线观看 | 日韩欧美一区二区在线播放 | 国产精品一区二区精品视频免费看 | 久久久999免费视频 日韩网站在线 | 欧美乱大交 | 99久久久免费视频 | 亚洲综合爱 | 国产在线播放一区二区 | 中文字幕一区二区三区在线播放 | 超碰在线观看av.com | 精品久久久99 | 91精品啪啪 | 天天色.com| 久久久久久久久久久久国产精品 | 国产精品密入口果冻 | 视频一区二区在线观看 | 91av观看| 亚洲欧美日韩精品一区二区 | 久色小说 | 国内成人综合 | 干av在线| 亚洲欧美日韩中文在线 | 久久久av电影 | 国产亚洲综合在线 | 99热精品视| 黄色av免费电影 | 久久一线| 永久av免费在线观看 | 91视频亚洲| 亚洲精品色视频 | 亚洲一区二区天堂 | 最新日本中文字幕 | 久久久视屏 | 91日韩免费 | 伊甸园av在线 | 天天天天射 | 日日精品| 97小视频 | 91免费在线看片 | 99精品免费观看 | 亚洲午夜av久久乱码 | 1024手机看片国产 | 天天操夜操 | 久久久久国产一区二区三区 | 天天操天天操天天操天天操 | 99在线精品免费视频九九视 | 国产激情久久久 | 99精品在线视频播放 | 精品国产aⅴ麻豆 | 韩国在线视频一区 | 久久久久亚洲精品成人网小说 | 免费合欢视频成人app | 久久成 | 国产成人精品一区二区三区免费 | 在线观看免费91 | av电影在线免费观看 | 免费av网站在线 | 91xav| 中文字幕视频一区二区 | 日本黄色免费在线 | 天天夜操 | 国产黄色精品 | 夜夜视频资源 | 久久夜色精品亚洲噜噜国4 午夜视频在线观看欧美 | 国产婷婷vvvv激情久 | 91精品区 | 久久久久久久毛片 | 九九免费观看视频 | 欧美国产日韩激情 | www色| 久久五月网 | 麻豆精品在线 | 亚洲成av人片一区二区梦乃 | 欧美一区二区视频97 | 国产精品第一视频 | 99国产精品免费网站 | 婷婷久草| 日韩免费三级 | 国产亚洲精品久久久久秋 | 成年人免费电影在线观看 | 欧美少妇的秘密 | 有码中文在线 | 久久99精品久久久久久三级 | 久久成人欧美 | 依人成人综合网 | 麻豆视频免费入口 | 国内一级片在线观看 | 色av男人的天堂免费在线 | 欧美久久精品 | 精品中文字幕在线 | av在线播放一区二区三区 | 人人狠| 国产高清精品在线 | 色妞色视频一区二区三区四区 | 在线播放日韩av | 久久久久国产一区二区三区四区 | 久久这里精品视频 | 精品一区二区在线观看 | 国内亚洲精品 | 国产精品毛片一区二区三区 | 天天插天天射 | 日本韩国精品在线 | 日韩在线网址 | 精品视频www | 在线免费黄色av | 国产福利一区二区在线 | 一区视频在线 | 久久五月精品 | 五月婷婷中文字幕 | 丁香婷婷社区 | 日韩网站中文字幕 | 正在播放日韩 | 欧美一级久久久 | 国产97视频在线 | 黄网站大全 | 激情深爱.com | 精品一区 在线 | 日产av在线播放 | 欧美日韩午夜爽爽 | 玖玖爱国产在线 | 字幕网av| 日韩欧美专区 | 国产一区视频导航 | 国产一线天在线观看 | 五月婷婷综合在线 | 91精品一区国产高清在线gif | 二区三区精品 | 久久这里只有精品首页 | 成人a级网站 | 91视频这里只有精品 | 国产精品人成电影在线观看 | 97电院网手机版 | 久久你懂得 | 国产成本人视频在线观看 | 91精品国产成人观看 | 国产精品美女免费视频 | 在线视频观看你懂的 | 一区二区欧美激情 | 久草在线99 | 亚州激情视频 | 欧美日韩高清一区 | 国产成人精品在线 | 国际av在线 | 日韩在线观看av | 波多野结衣视频一区 | 国产一级精品视频 | 色婷在线 | 免费网站观看www在线观看 | 在线免费观看的av | 亚洲综合成人在线 | 激情在线网址 | h视频日本 | 在线观看视频 | 香蕉97视频观看在线观看 | 久久婷婷影视 | 黄色片免费电影 | 日日日操| 色婷婷综合五月 | 涩涩成人在线 | 99视频播放 | 亚洲国产97在线精品一区 | 午夜黄网 | 丝袜护士aⅴ在线白丝护士 天天综合精品 | 欧美在线视频日韩 | 日韩免费区 | 中文字幕美女免费在线 | 五月激情五月激情 | 精品亚洲午夜久久久久91 | 色橹橹欧美在线观看视频高清 | 911香蕉视频| 亚洲码国产日韩欧美高潮在线播放 | 人人看人人草 | 91久久精品一区二区二区 | 久久久久中文 | 亚洲精品在线观看不卡 | 亚洲成人精品在线 | 成人黄色小说在线观看 | 国产精品12345 | 日本大尺码专区mv | 人人草人 | 国产精品乱码高清在线看 | 国产69精品久久99的直播节目 | 伊人婷婷在线 | 国产一级黄色免费看 | 久久激情网站 | 久久久国产一区二区三区 | 中文字幕免费中文 | 永久av免费在线观看 | 色综合久久88色综合天天免费 | 日本中文字幕视频 | 欧美一二区视频 | 国产精品av免费在线观看 | 久久综合九色 | 久久专区 | 久久少妇 | 中文字幕日本在线 | 欧美aa在线 | 看污网站| 天天操天天能 | 日韩在线观看电影 | 国产在线精品二区 | 日韩精品一区二区三区在线播放 | 超碰99在线 | 国产在线无 | 美女在线国产 | 免费看黄的视频 | 激情图片qvod | 东方av在| 五月婷久| 亚洲一区二区精品视频 | 成人激情开心网 | 国产成在线观看免费视频 | 亚洲视频专区在线 | 中文字幕在线观看1 | 狠狠色噜噜狠狠狠狠 | 欧美亚洲专区 | 成人免费大片黄在线播放 | 亚洲精品视频免费在线观看 | 依人成人综合网 | 成人免费观看av | 91精品国产99久久久久 | 色综合在 | 国产成人亚洲在线观看 | 国产成人久久精品一区二区三区 | 亚洲资源在线观看 | 在线国产欧美 | 亚洲一区二区观看 | 在线看片一区 | 蜜臀av网址| 最近中文字幕高清字幕免费mv | 超碰在线cao | 一区二区电影在线观看 | 成人av直播 | 国产精品久久久久久久久费观看 | 成人91免费视频 | 亚洲精品在线观看不卡 | 欧美视频一区二 | 国内精品久久久 | 国产成人久久精品77777综合 | 成人免费av电影 | 国产精品高潮呻吟久久久久 | 91看片一区二区三区 | 久久在线免费观看 | 日韩精品视频免费看 | 久久久久久久久久久影视 | 国产黄色精品网站 | 亚州精品成人 | 国产99久久精品一区二区永久免费 | 91精选在线 | 国产精品99久久久久久久久 | av色网站 | 欧美精品免费在线 | 视频一区二区在线观看 | 精品国产伦一区二区三区免费 | 国产亚洲精品综合一区91 | 91亚洲精品久久久中文字幕 | 日韩高清不卡在线 | 亚洲精品高清视频在线观看 | 狠狠干夜夜 | 久草免费在线 | 欧美精品久久久久久久久久 | 91丨porny丨九色 | 国产亚洲精品成人av久久ww | aaa亚洲精品一二三区 | 五月激情电影 | 国产精品久久久久久久久蜜臀 | www.国产在线| 成人黄色短片 | 久久社区视频 | 国产成人一区二区三区 | 2020天天干夜夜爽 | 992tv在线| av在线精品 | 97狠狠干 | www四虎影院 | 91爱爱视频| 欧美日韩在线免费视频 | 亚洲精品国精品久久99热一 | 国产亚洲免费观看 | 3d黄动漫免费看 | 久久激情小说 | 99视频+国产日韩欧美 | 中文字幕视频三区 | 国产精品久久婷婷六月丁香 | 热热热热热色 | 久久综合射 | 视频国产一区二区三区 | 亚洲综合一区二区精品导航 | 久草在线在线精品观看 | 亚州精品在线视频 | 午夜精品成人一区二区三区 | 亚洲欧美日韩中文在线 | 色婷久久 | 欧美在线视频第一页 | 日韩视频在线不卡 | 久久男女视频 | 欧美三级免费 | 国产黄a三级三级三级三级三级 | 日韩免费电影在线观看 | 国产精品女同一区二区三区久久夜 | 久久久国产精品免费 | 最近中文字幕视频完整版 | av黄色一级片 | 丁五月婷婷 | 成人a毛片| 中文字幕 国产 一区 | 激情综合五月天 | 最近日本字幕mv免费观看在线 | 久草在线观看 | 99精品在这里 | 黄色大片视频网站 | 久久成人亚洲欧美电影 | 激情导航| 国产大片黄色 | 国产精品扒开做爽爽的视频 | 欧美色图亚洲图片 | 在线观看久久久久久 | 九九九在线 | 五月开心激情网 | 免费美女久久99 | 久久人人97超碰精品888 | 一区 在线观看 | 免费日韩电影 | 黄色的网站免费看 | 中文字幕色在线 | 国产精品手机在线播放 | 婷婷六月天在线 | 在线观看免费一区 | 欧美91成人网 | 久久精品久久99 | 91av福利视频 | 在线观看免费视频你懂的 | 中文字幕视频免费观看 | 久久影院中文字幕 | 视频精品一区二区三区 | 中文字幕乱码电影 | 国内精品久久久久久久 | 久久久在线 | 日日日干| 国内成人综合 | 国产福利不卡视频 | 日本亚洲国产 | 国内精品视频免费 | 亚洲精品一区中文字幕乱码 | 欧美va天堂在线电影 | 日日麻批40分钟视频免费观看 | 日韩在线一二三区 | 国产黄色精品视频 | 日日夜夜精品免费 | 国产在线观看中文字幕 | 色99在线 | 五月开心激情网 | 欧美日韩午夜 | 超碰97在线看 | 国产一区视频在线观看免费 |