publicPath指定了一個(gè)在瀏覽器中被引用的URL地址。 對(duì)于使用 和 加載器,當(dāng)文件路徑不同于他們的本地磁盤路徑(由path指定)時(shí)候publicPath被用來(lái)作為href或者url指向該文件。這種做法在你需要將靜態(tài)文件放在不同的域名或者CDN上面的時(shí)候是很有用的。 Webpack Dev Server 也是用這個(gè)方式來(lái)讀取文件的。與path搭配使用上[hash]就可以做好緩存方案了。
config.js
output: {? ? path: "/home/proj/public/assets",? ? publicPath: "/assets/"}
index.html
使用CDN 和 hash的例子.
config.js
output: {? ? path: "/home/proj/cdn/assets/[hash]",? ? publicPath: "http://cdn.example.com/assets/[hash]/"}
注: 萬(wàn)一最終輸出文件的publicPath在編譯的時(shí)候不知道,那么你可以不填,動(dòng)態(tài)的在運(yùn)行時(shí)添加也可以。如果在編譯過(guò)程你不知道publicPath你可以忽略他,然后在你的入口文件里面添加上這個(gè)字段就可以了__webpack_public_path__。
__webpack_public_path__ = myRuntimePublicPath// rest of your application entry
output.chunkFilename
非入口chunk的文件名,作為一個(gè)相對(duì)路徑放到output.path里。
[id] 替換chunk的id.
[name] 替換chunk的名字 (or 如果沒(méi)有名字就用id替換).
[hash] 替換編譯的hash.
[chunkhash] 替換chunk的hash.
output.sourceMapFilename
js文件的SourceMap的文件名. 也同樣在 output.path 路徑下面.
[file] 替換js文件的文件名.
[id] 替換chunk的id.
[hash] 替換編譯的hash.
默認(rèn): "[file].map"
output.devtoolModuleFilenameTemplate
在生成的SourceMap里的函數(shù)sources數(shù)組的文件名模板。[resource]替換被Webpack用來(lái)解析文件的路徑,包括最右邊的加載器的請(qǐng)求參數(shù)(如果有的話)。
[resource-path] 和 [resource]一樣但是沒(méi)有參數(shù)的事.
[loaders] 是加載器和最右加載器(顯示加載器)的參數(shù)名的列表[all-loaders] 是加載器和最右加載器(包括自動(dòng)加載器)的參數(shù)名的列表 [id] 替換module的id [hash]替換module標(biāo)識(shí)符的hash[absolute-resource-path] 替換文件絕對(duì)路徑名
默認(rèn) (devtool=[inline-]source-map):"webpack:///[resource-path]"
默認(rèn) (devtool=eval): "webpack:///[resource-path]?[loaders]"
默認(rèn) (devtool=eval-source-map): "webpack:///[resource-path]?[hash]"
也可以定義成函數(shù)而不是字符串模板,該函數(shù)將接受info對(duì)象參數(shù),次對(duì)象有下面幾個(gè)屬性:
identifier
shortIdentifier
resource
resourcePath
absoluteResourcePath
allLoaders
query
moduleId
hash
output.devtoolFallbackModuleFilenameTemplate
和output.devtoolModuleFilenameTemplate一樣,但是用在有重復(fù)module標(biāo)識(shí)符的時(shí)候。
默認(rèn): "webpack:///[resourcePath]?[hash]"
output.devtoolLineToLine
為所有模塊啟用行映射模式,行映射模式用了一個(gè)簡(jiǎn)單的SourceMap,用在了每一行生成的source映射到原始的source,這是一個(gè)性能優(yōu)化,僅用在你的性能需要更佳,你確定輸入行對(duì)應(yīng)生成行的時(shí)候。
true 用在所有模塊(不建議)
可以用類似于 module.loaders 的帶有{test, include, exclude}對(duì)象 來(lái)開啟特定文件.
默認(rèn): disabled
output.hotUpdateChunkFilename
熱替換chunks的文件名. 在output.path目錄里。
[id] 替換chunk的id.
[hash] 替換編譯的hash. (記錄里的最近一個(gè)hash)
默認(rèn): "[id].[hash].hot-update.js"
output.hotUpdateMainFilename
熱替換主文件的的名字。在output.path目錄里。
[hash] 替換編譯的hash. (記錄里的最近一個(gè)hash)
默認(rèn): "[hash].hot-update.json"
output.jsonpFunction
webpack異步加載的JSONP函數(shù). 較短的函數(shù)可以縮小文件的大小,在一個(gè)頁(yè)面里面擁有多個(gè)webpack引用的時(shí)候,需要使用不同的標(biāo)識(shí)符.
默認(rèn): "webpackJsonp"
output.hotUpdateFunction
熱替換時(shí)候一步更新js的jsonp方法.
Default: "webpackHotUpdate"
output.pathinfo
包含了一些module的信息的注解.
require(/* ./test */23)
不要在生產(chǎn)環(huán)境里面使用.
默認(rèn): false
output.library
如果設(shè)置了此項(xiàng), 將會(huì)把bundle打包成lib. output.library 的值就是文件名.
如果你在寫一個(gè)單一的文件庫(kù)的時(shí)候后使用他.
output.libraryTarget
格式化導(dǎo)出的庫(kù):
"var" - 通過(guò)設(shè)置一個(gè)變量導(dǎo)出: var Library = xxx (default)
"this" - 通過(guò)設(shè)置 this的屬性來(lái)導(dǎo)出: this["Library"] = xxx
"commonjs" - 通過(guò)設(shè)置 exports的屬性導(dǎo)出: exports["Library"] = xxx
"commonjs2" - 通過(guò)設(shè)置 module.exports導(dǎo)出: module.exports = xxx
"amd" - 導(dǎo)出為AMD (視情況可通過(guò)output.library來(lái)命名)
"umd" - 導(dǎo)出為 AMD, CommonJS2 或者是頂級(jí)屬性
默認(rèn): "var"
如 output.library 沒(méi)有設(shè)置, 但是 output.libraryTarget 被設(shè)置為了var以外的選項(xiàng), 導(dǎo)出的對(duì)象的每個(gè)屬性都是被復(fù)制的 (除了 amd,commonjs2 和 umd).
output.umdNamedDefine
如果 output.libraryTarget 被設(shè)置為 umd 且 output.library 被 設(shè)置, 設(shè)置該項(xiàng)為 true 將為AMD module 命名.
output.sourcePrefix
在代碼的每一行前面加上此前綴.
默認(rèn): "\t"
output.crossOriginLoading
允許跨域加載chunk.
可能的值有:
false - 禁止.
"anonymous" - 可用.credentials將不隨請(qǐng)求被發(fā)送.
"use-credentials" - 可用.credentials將隨請(qǐng)求被發(fā)送.
更多請(qǐng)查閱MDN
默認(rèn): false
module
影響標(biāo)準(zhǔn) module 的選項(xiàng)(NormalModuleFactory)
module.loaders
自動(dòng)引用的加載器的數(shù)組.
每個(gè)元素有這些選項(xiàng):
test: 必須滿足的條件
exclude: 不滿足的條件
include: 必須滿足條件
loader: 用 "!" 隔開多個(gè)loader
loaders: 多個(gè)loader
可能有一項(xiàng)是正則表達(dá)式(測(cè)試絕對(duì)路徑),包含絕對(duì)路徑的字符串,一個(gè)函數(shù) function(absPath): bool,或者一個(gè)數(shù)組,用"and"結(jié)合
更多:loaders
重要信息:這里的loader解析了他們應(yīng)用相關(guān)的資源,這意味著他們不需要解析配置過(guò)的文件。如果你用npm安裝loaders,node_modules文件夾不在資源文件夾的父目錄中,webpack就找不到這個(gè)loader。你需要把node_modules文件夾的絕對(duì)路徑添加到resolveLoader.root這個(gè)選項(xiàng)中。 (resolveLoader: { root: path.join(__dirname, "node_modules") })
例子:
module: {? loaders: [? ? {? ? ? // "test" is commonly used to match the file extension? ? ? test: /\.jsx$/,? ? ? // "include" is commonly used to match the directories? ? ? include: [? ? ? ? path.resolve(__dirname, "app/src"),? ? ? ? path.resolve(__dirname, "app/test")? ? ? ],? ? ? // "exclude" should be used to exclude exceptions? ? ? // try to prefer "include" when possible? ? ? // the "loader"? ? ? loader: "babel-loader"? ? }? ]}
module.preLoaders, module.postLoaders
語(yǔ)法跟module.loaders很像,前置和后置裝載的數(shù)組loaders.
module.noParse
一個(gè)正則表達(dá)式或者一組正則,不會(huì)匹配到的路徑 它不匹配整個(gè)解析請(qǐng)求。
當(dāng)忽略大的庫(kù)的時(shí)候可以提高性能
該文件預(yù)計(jì)不可調(diào)用require,define或者其他類似的東西,不過(guò)可以用exports和modulle.exports.
自動(dòng)創(chuàng)建上下文默認(rèn)值 module.xxxContextXxx
這有許多選項(xiàng)配置自動(dòng)創(chuàng)建上下文的默認(rèn)值,我們區(qū)分三種情況下自動(dòng)創(chuàng)建的上下文:
exprContext: 一個(gè)作為依賴的表達(dá)式 (如 require(expr))
wrappedContext: 一個(gè)加前綴或者后綴的字符串 (i. e.require("./templates/" + expr))
unknownContext: 一些其他不解析的 require (i. e. require)
四個(gè)選項(xiàng)用來(lái)自動(dòng)創(chuàng)建上下文:
request: 上下文的請(qǐng)求.
recursive: 遞歸: 子目錄需要被遍歷.
regExp: 正則表達(dá)式.
critical: 這種類型的依賴應(yīng)該被視為關(guān)鍵(發(fā)出警告).
選項(xiàng)和默認(rèn)值:
unknownContextRequest = ".", unknownContextRecursive = true, unknownContextRegExp = /^\.\/.*$/,unknownContextCritical = true
exprContextRequest = ".", exprContextRegExp = /^\.\/.*$/,exprContextRecursive = true, exprContextCritical = true
wrappedContextRegExp = /.*/, wrappedContextRecursive = true, wrappedContextCritical = false
注意: module.wrappedContextRegExp 只指完整的正則表達(dá)式的中間部分,剩下的就是從字頭和字尾里產(chǎn)生.
例子:
{? module: {? ? // Disable handling of unknown requires? ? unknownContextRegExp: /$^/,? ? unknownContextCritical: false,? ? // Disable handling of requires with a single expression? ? exprContextRegExp: /$^/,? ? exprContextCritical: false,? ? // Warn for every expression in require? ? wrappedContextCritical: true? }}
resolve
影響解析模塊的選項(xiàng)resolve.
resolve.alias
模塊被其他模塊名和路徑替代.
改配置對(duì)象鍵名為模塊名,鍵值為新的路徑。類似于替換但是更比替換更好。如果該鍵結(jié)尾是只有$的確切匹配(沒(méi)有$)將被替換。
如果鍵值是相對(duì)路徑,它將與該文件中包含的文件相對(duì)
例子: 請(qǐng)求 /abc/entry.js 里面的require ,不同的alias對(duì)比.
alias:require("xyz")require("xyz/file.js"){}/abc/node_modules/xyz/index.js/abc/node_modules/xyz/file.js{ xyz: "/absolute/path/to/file.js" }/absolute/path/to/file.js/abc/node_modules/xyz/file.js{ xyz$: "/absolute/path/to/file.js" }/absolute/path/to/file.jserror{ xyz: "./dir/file.js" }/abc/dir/file.js/abc/node_modules/xyz/file.js{ xyz$: "./dir/file.js" }/abc/dir/file.jserror{ xyz: "/some/dir" }/some/dir/index.js/some/dir/file.js{ xyz$: "/some/dir" }/some/dir/index.js/abc/node_modules/xyz/file.js{ xyz: "./dir" }/abc/dir/index.js/abc/dir/file.js{ xyz: "modu" }/abc/node_modules/modu/index.js/abc/node_modules/modu/file.js{ xyz$: "modu" }/abc/node_modules/modu/index.js/abc/node_modules/xyz/file.js{ xyz: "modu/some/file.js" }/abc/node_modules/modu/some/file.jserror{ xyz: "modu/dir" }/abc/node_modules/modu/dir/index.js/abc/node_modules/dir/file.js{ xyz: "xyz/dir" }/abc/node_modules/xyz/dir/index.js/abc/node_modules/xyz/dir/file.js{ xyz$: "xyz/dir" }/abc/node_modules/xyz/dir/index.js/abc/node_modules/xyz/file.js
index.js 可能會(huì)解析其他的文件,如果設(shè)置了 package.json的話.
/abc/node_modules 也可能解析到/node_modules里.
resolve.root
包含你模塊的目錄(絕對(duì)路徑),通常是一個(gè)目錄數(shù)組,這個(gè)設(shè)置應(yīng)該被用于添加個(gè)人目錄到webpack查找路徑里.
必須是個(gè)絕對(duì)路徑,不要這樣寫./app/modules.
例子:
var path = require('path');// ...resolve: {? root: [? ? path.resolve('./app/modules'),? ? path.resolve('./vendor/modules')? ]}
resolve.modulesDirectories
解析目錄名的一個(gè)數(shù)組到當(dāng)前目錄以及先前的目錄,并且是查找模塊。這個(gè)函數(shù)和node怎么找到node_modules很像。比如如果值為["mydir"],webpack會(huì)查找“./mydir”, “../mydir”, “../../mydir”,等等.
默認(rèn): ["web_modules", "node_modules"]
注意: Passing "../someDir", "app", "." or an absolute path isn't necessary here. Just use a directory name, not a path. Use only if you expect to have a hierarchy within these folders. Otherwise you may want to use the resolve.root option instead.
resolve.fallback
webpack沒(méi)有在resolve.root 或者resolve.modulesDirectories找到的模塊的一個(gè)目錄(或者目錄絕對(duì)路徑的數(shù)組).
resolve.extensions
解析模塊的拓展名的數(shù)組。比如,為了發(fā)現(xiàn)一個(gè)CS文件,你這數(shù)組里應(yīng)該包含字符串".coffee".
默認(rèn): ["", ".webpack.js", ".web.js", ".js"]
重要信息: 設(shè)置這個(gè)選項(xiàng)將會(huì)重寫默認(rèn)值,這意味著webpack不再試著用默認(rèn)的拓展名解析模塊,如果你希望模塊加載的時(shí)候帶著他們的拓展名也可以得到正確額解析(比如require('./somefile.ext')),你需要在你的數(shù)組里添加一個(gè)空字符串。如果你希望模塊加載不帶拓展名(比如require('underscore'))可以解析為“.js”的拓展名。你必須在數(shù)組里包含".js".
resolve.packageMains
在package.json中查找符合這些字段的文件.
默認(rèn): ["webpack", "browser", "web", "browserify", ["jam", "main"], "main"]
resolve.packageAlias
在package.json中查詢對(duì)象里的字段,鍵值對(duì)是按照這個(gè)規(guī)范的別名來(lái)進(jìn)行的
沒(méi)有默認(rèn)值
比如: 比如"browser"會(huì)檢查browser字段.
resolve.unsafeCache
啟用不安全的緩存來(lái)解析一部分文件。改變緩存路徑也許會(huì)導(dǎo)致出錯(cuò)(罕見(jiàn)情況下)。 一個(gè)正則表達(dá)式數(shù)組里,只有一個(gè)正則或只有一個(gè)為true(對(duì)應(yīng)全部文件)是最好的實(shí)踐 。如果解析路徑匹配,就會(huì)被緩存。
默認(rèn): []
resolveLoader
像 resolve 但是是對(duì)于loaders.
// 默認(rèn):{? ? modulesDirectories: ["web_loaders", "web_modules", "node_loaders", "node_modules"],? ? extensions: ["", ".webpack-loader.js", ".web-loader.js", ".loader.js", ".js"],? ? packageMains: ["webpackLoader", "webLoader", "loader", "main"]}
注意,你可以用alias,其他特性和resolve相似。例如 { txt: 'raw-loader' }是 txt!templates/demo.txt用 raw-loader后的結(jié)果.
resolveLoader.moduleTemplates
這是resolveLoader 唯一的屬性.
它描述了嘗試的模塊名稱的替代名
默認(rèn): ["*-webpack-loader", "*-web-loader", "*-loader", "*"]
externals
指定的依賴不會(huì)被webpack解析,但會(huì)成為bundle里的依賴。output.libraryTarget.決定著依賴的類型
值是對(duì)象,字符串,函數(shù),正則,數(shù)組都會(huì)被接受。
字符串:一個(gè)精確匹配的依賴會(huì)變成外部依賴,同意的字符串會(huì)被用于外部依賴。
對(duì)象:如果依賴精確匹配到了對(duì)象的一個(gè)屬性,屬性值就會(huì)被當(dāng)作依賴。屬性值可以包含一個(gè)依賴型的前綴,用一個(gè)空格隔開。如果屬性值為true,則使用該屬性名。如果屬性值為false,外部測(cè)試失敗,這個(gè)依賴是內(nèi)部依賴。見(jiàn)下面的例子。
函數(shù):function(context, request, callback(err, result))。函數(shù)會(huì)在每個(gè)依賴中調(diào)用。如果結(jié)果被傳遞到回調(diào)函數(shù)里,這個(gè)值就會(huì)被像處理對(duì)象屬性值那樣處理。
正則表達(dá)式:每個(gè)被匹配的依賴都會(huì)成為外部依賴。匹配的文本會(huì)被用作外部依賴的請(qǐng)求。因?yàn)檎?qǐng)求是用于生成外部代碼鉤子的確切代碼,如果你匹配到一個(gè)cmd的包(比如 ‘../some/package.js’),相反使用外部function的策略。你可以通過(guò)callback(null, "require('" + request + "')"引入包,這個(gè)包生成module.exports = require('../some/package.js');使用要求在webpack上下文外。
數(shù)組:這個(gè)表的多個(gè)值(遞歸) 例如:
{? ? output: { libraryTarget: "commonjs" },? ? externals: [? ? ? ? {? ? ? ? ? ? a: false, // a is not external? ? ? ? ? ? b: true, // b is external (require("b"))? ? ? ? ? ? "./c": "c", // "./c" is external (require("c"))? ? ? ? ? ? "./d": "var d" // "./d" is external (d)? ? ? ? },? ? ? ? // Every non-relative module is external? ? ? ? // abc -> require("abc")? ? ? ? /^[a-z\-0-9]+$/,? ? ? ? function(context, request, callback) {? ? ? ? ? ? // Every module prefixed with "global-" becomes external? ? ? ? ? ? // "global-abc" -> abc? ? ? ? ? ? if(/^global-/.test(request))? ? ? ? ? ? ? ? return callback(null, "var " + request.substr(7));? ? ? ? ? ? callback();? ? ? ? },? ? ? ? "./e" // "./e" is external (require("./e"))? ? ]}
typevalueresulting import code"var""abc"module.exports = abc;"var""abc.def"module.exports = abc.def;"this""abc"(function() { module.exports = this["abc"]; }());"this"["abc", "def"](function() { module.exports = this["abc"]["def"]; }());"commonjs""abc"module.exports = require("abc");"commonjs"["abc", "def"]module.exports = require("abc").def;"amd""abc"define(["abc"], function(X) { module.exports = X; })"umd""abc"everything above
如果沒(méi)有作為amd/umd的目標(biāo)解析,將會(huì)執(zhí)行amd或者umd的額外值.
注意,如果用umd你可以指定一個(gè)對(duì)象的額外值,屬性為 commonjs, commonjs2, amd和root會(huì)被設(shè)置不同的值.
target
編譯到的目標(biāo)使用環(huán)境
"web" 瀏覽器環(huán)境(默認(rèn))
"webworker" WebWorker
"node" node (使用 require 加載 chunk)
"async-node" node (使用 fs 和 vm 來(lái)加載異步chunk)
"node-webkit" webkit, 使用jsonp加載chunk 但同樣支持 node.js module 加, equire("nw.gui") (實(shí)驗(yàn)性)
"electron"Electron– 支持 require 帶有Electron特性 modules.
bail
將第一個(gè)錯(cuò)誤報(bào)告為嚴(yán)重錯(cuò)誤而不是容忍他。
profile
為每一個(gè)module捕獲定時(shí)信息。
提示: 使用analyze tool來(lái)做可視化分析. --json 或者stats.toJson() 將給出states的JSON數(shù)據(jù).
cache
在多次增量編譯時(shí)候,緩存生成的moudle和chunk來(lái)提高性能。
在watch模式下面默認(rèn)是開啟的.
你可以傳false將它禁止掉.
你也可以傳遞一個(gè)對(duì)象來(lái)開啟他,并且webpack會(huì)利用傳入的對(duì)象作為緩存,這樣你就可以在多次編譯當(dāng)中共享緩存對(duì)象。 注意:不要在不同的選項(xiàng)之間共享緩存。
debug
講loader調(diào)到debug模式.
devtool
選擇開發(fā)工具來(lái)提高debug效率.
eval 文檔上解釋的很明白,每個(gè)模塊都封裝到 eval 包裹起來(lái),并在后面添加 //# sourceURL
source-map 這是最原始的 source-map 實(shí)現(xiàn)方式,其實(shí)現(xiàn)是打包代碼同時(shí)創(chuàng)建一個(gè)新的 sourcemap 文件, 并在打包文件的末尾添加 //# sourceURL 注釋行告訴 JS 引擎文件在哪兒
hidden-source-map 文檔上也說(shuō)了,就是 soucremap 但沒(méi)注釋,沒(méi)注釋怎么找文件呢?貌似只能靠后綴,譬如 xxx/bundle.js 文件,某些引擎會(huì)嘗試去找 xxx/bundle.js.map
inline-source-map 為每一個(gè)文件添加 sourcemap 的 DataUrl,注意這里的文件是打包前的每一個(gè)文件而不是最后打包出來(lái)的,同時(shí)這個(gè) DataUrl 是包含一個(gè)文件完整 souremap 信息的 Base64 格式化后的字符串,而不是一個(gè) url。
eval-source-map 這個(gè)就是把 eval 的 sourceURL 換成了完整souremap 信息的 DataUrl
cheap-source-map 不包含列信息,不包含 loader 的sourcemap,(譬如 babel 的 sourcemap)
cheap-module-source-map 不包含列信息,同時(shí) loader 的 sourcemap 也被簡(jiǎn)化為只包含對(duì)應(yīng)行的。最終的 sourcemap 只有一份,它是 webpack 對(duì) loader 生成的 sourcemap 進(jìn)行簡(jiǎn)化,然后再次生成的。
前綴 @, # 或者 #@ 將執(zhí)行編譯指示風(fēng)格. (默認(rèn) #, 推薦)
可以組合使用. hidden, inline, eval 標(biāo)注樣式是獨(dú)立的.
比如. cheap-module-inline-source-map, cheap-eval-source-map,#@source-map
注意: 如果你的module已經(jīng)包含了SourceMap那么你需要使用source-map-loader將導(dǎo)出的sourceMap合并.
devtool編譯重編譯速度生產(chǎn)環(huán)境支持質(zhì)量eval++++++nogenerated codecheap-eval-source-map+++notransformed code (lines only)cheap-source-map+oyestransformed code (lines only)cheap-module-eval-source-mapo++nooriginal source (lines only)cheap-module-source-mapo-yesoriginal source (lines only)eval-source-map--+nooriginal sourcesource-map----yesoriginal source
例如:
{? ? devtool: "#inline-source-map"}// =>//# sourceMappingURL=...
注意: 下一個(gè)主要版本里面 -d 選項(xiàng) 將改成 cheap-module-eval-source-map
devServer
設(shè)置webpack-dev-server的相關(guān)配置。
例子:
{? ? devServer: {? ? ? ? contentBase: "./build",? ? }}
node
包含了許多node的polyfills或者mock
console: true 或者 false
global: true 或者 false
process: true, "mock" 或者 false
Buffer: true 或者 false
__filename: true (real filename), "mock" ("/index.js") 或者 false
__dirname: true (真實(shí) dirname), "mock" ("/") 或者false
: true, "mock", "empty" 或者 false
// Default:{? ? console: false,? ? global: true,? ? process: true,? ? Buffer: true,? ? __filename: "mock",? ? __dirname: "mock",? ? setImmediate: true}
amd
設(shè)置require.amd和define.amd的值 例如: amd: { jQuery: true } ( 1.x AMD 版本的jQuery)
loader
自定義一些在加載器上下文有用的值。
recordsPath, recordsInputPath,recordsOutputPath
存儲(chǔ)/加載 compiler狀態(tài) 從/到 一個(gè)json文件里面。結(jié)果將會(huì)是一些module和chunk的固定id。
需要是 絕對(duì)路徑,如果recordsInputPath,recordsOutputPath都為undefined,recordsInputPath將被使用。
在多個(gè)編譯請(qǐng)求做熱替換的時(shí)候是需要這個(gè)配置的。
plugins
給編譯器添加額外的插件.