摘要:配置以何種方式導(dǎo)出庫。當(dāng)檢測文件不再發(fā)生變化,會(huì)先緩存起來,等等待一段時(shí)間后之后再通知監(jiān)聽者,這個(gè)等待時(shí)間通過配置。發(fā)布到線上給用戶使用的運(yùn)行環(huán)境。
一 縮小文件搜索范圍 1 include & exclude 1) action
限制編譯范圍
2) useagemodule: { rules: [ { test: /.js$/, use: ["babel-loader?cacheDirectory"], include: path.resolve(__dirname, "src"), exclude: /node_modules/ } ] }
"babel-loader?cacheDirectory"
You can also speed up babel-loader by as much as 2x by using the cacheDirectory option. This will cache transformations to the filesystem.
QA[BABEL] Note: The code generator has deoptimised the styling of "/Users/xxx/Documents/xxx/webpack_test/test3/node_modules/lodash/lodash.js" as it exceeds the max of "500KB".
加上exclude限制范圍就不會(huì)報(bào)錯(cuò)了
2 resolve.modules 1) actionTell webpack what directories should be searched when resolving modules.
2) useageresolve: { modules: [path.resolve("node_modules"), path.resolve("lib")] }3) note
Absolute and relative paths can both be used, but be aware that they will behave a bit differently.
A relative path will be scanned similarly to how Node scans for node_modules, by looking through the current directory as well as it"s ancestors (i.e. ./node_modules, ../node_modules, and on).
With an absolute path, it will only search in the given directory.
If you want to add a directory to search in that takes precedence over node_modules/:(即是有先后順序的)
modules: [path.resolve(__dirname, "src"), "node_modules"]4) QA
Module not found: Error: Can"t resolve "ajax" in "/Users/xxx/Documents/xxx/webpack_test/test3/src"
當(dāng)你需要指定除node_modules之外的其它模塊目錄的時(shí)候可以在數(shù)組中添加屬性
3 resolve.mainFields 1) actionWebpack 配置中的 resolve.mainFields 用于配置第三方模塊使用哪個(gè)入口文件。
安裝的第三方模塊中都會(huì)有一個(gè) package.json文件,用于描述這個(gè)模塊的屬性,其中有些字段用于描述入口文件在哪里,resolve.mainFields 用于配置采用哪個(gè)字段作為入口文件的描述。
可以存在多個(gè)字段描述入口文件的原因是因?yàn)橛行┠K可以同時(shí)用在多個(gè)環(huán)境中,針對(duì)不同的運(yùn)行環(huán)境需要使用不同的代碼。 以 isomorphic-fetch API 為例,它是 Promise的一個(gè)實(shí)現(xiàn),但可同時(shí)用于瀏覽器和 Node.js 環(huán)境。
2) useage為了減少搜索步驟,在你明確第三方模塊的入口文件描述字段時(shí),你可以把它設(shè)置的盡量少。 由于大多數(shù)第三方模塊都采用 main字段去描述入口文件的位置,可以這樣配置 Webpack:
module.exports = { resolve: { // 只采用 main 字段作為入口文件描述字段,以減少搜索步驟 mainFields: ["main"], }, };4 resolve.alias 1) action
配置項(xiàng)通過別名來把原導(dǎo)入路徑映射成一個(gè)新的導(dǎo)入路徑
此優(yōu)化方法會(huì)影響使用Tree-Shaking去除無效代碼
2) useagealias: { "bootstrap": "bootstrap/dist/css/bootstrap.css" }5 resolve.extensions 1) action
在導(dǎo)入語句沒帶文件后綴時(shí),Webpack會(huì)自動(dòng)帶上后綴后去嘗試詢問文件是否存在 -
默認(rèn)后綴是 extensions: [".js", ".json"]
2) useage 3) note后綴列表盡可能小
頻率最高的往前方
導(dǎo)出語句里盡可能帶上后綴
6 module.noParse 1) actionmodule.noParse 配置項(xiàng)可以讓 Webpack 忽略對(duì)部分沒采用模塊化的文件的遞歸解析處理
2) useagemodule: { noParse: [/react.min.js/] }2) note
被忽略掉的文件里不應(yīng)該包含 import 、 require 、 define 等模塊化語句二 DLL 1 action
dll 為后綴的文件稱為動(dòng)態(tài)鏈接庫,在一個(gè)動(dòng)態(tài)鏈接庫中可以包含給其他模塊調(diào)用的函數(shù)和數(shù)據(jù)
把基礎(chǔ)模塊獨(dú)立出來打包到多帶帶的動(dòng)態(tài)連接庫里
當(dāng)需要導(dǎo)入的模塊在動(dòng)態(tài)連接庫里的時(shí)候,模塊不能再次被打包,而是去動(dòng)態(tài)連接庫里獲取
2 usage定義插件(DLLPlugin) ---> 引用插件(DllReferencePlugin)
本次例子用jquery舉例
1) 定義DLL用于打包出一個(gè)個(gè)動(dòng)態(tài)連接庫
需要多帶帶build
webpack.jquery.config.js
module.exports = { entry: ["jquery"], output: { filename: "vendor.js", path: path.resolve(__dirname, "dist"), libraryTarget: "var",// 打包的方式,hou library: "vendor_lib_vendor"http:// DLL的名字 }, plugins: [ new webpack.DllPlugin({ name: "vendor_lib_vendor",// 定義DLL path: path.resolve(__dirname, "dist/vendor-manifest.json") }) ] };
package.json 的scripts添加
"dll": "webpack --config webpack.jquery.config.js --mode development"
配置好上述的文件后,在終端運(yùn)行 npm run dll,時(shí)候會(huì)在dist目錄下生成兩個(gè)文件,分別是vendor.js 和 vendor-manifest.json。vendor.js包含的就是打包后的jquery文件代碼,vendor-manifest.json是用來做關(guān)聯(lián)的。DLL定義好了,接下來就是應(yīng)用打包好的DLL了。
2) 引用DLLwebpack.config.js 配置文件中引入DllPlugin插件打包好的動(dòng)態(tài)連接庫
plugins: [ new webpack.DllReferencePlugin({ context: __dirname, manifest: require("./dist/vendor-manifest.json") }) ],3) 使用DLL
app.html3 note
在app.html的底部添加
libraryTarget 和 library
當(dāng)用 Webpack 去構(gòu)建一個(gè)可以被其他模塊導(dǎo)入使用的庫時(shí)需要用到它們。
output.libraryTarget 配置以何種方式導(dǎo)出庫。
output.library 配置導(dǎo)出庫的名稱。 它們通常搭配在一起使用。
output.libraryTarget 是字符串的枚舉類型,支持以下配置。
1) var (默認(rèn))編寫的庫將通過 var 被賦值給通過 library 指定名稱的變量。
假如配置了 output.library="LibraryName",則輸出和使用的代碼如下:
// Webpack 輸出的代碼 var LibraryName = lib_code; //其中 lib_code 代指導(dǎo)出庫的代碼內(nèi)容,是有返回值的一個(gè)自執(zhí)行函數(shù)。 // 使用庫的方法 LibraryName.doSomething();2) commonjs2
編寫的庫將通過 CommonJS 規(guī)范導(dǎo)出。
假如配置了 output.library="LibraryName",則輸出和使用的代碼如下:
// Webpack 輸出的代碼 exports["LibraryName"] = lib_code; // 使用庫的方法 require("library-name-in-npm")["LibraryName"].doSomething(); // 其中 library-name-in-npm 是指模塊發(fā)布到 Npm 代碼倉庫時(shí)的名稱。3) commonjs2
編寫的庫將通過 CommonJS2 規(guī)范導(dǎo)出,輸出和使用的代碼如下:
// Webpack 輸出的代碼 module.exports = lib_code; // 使用庫的方法 require("library-name-in-npm").doSomething();
CommonJS2 和 CommonJS 規(guī)范很相似,差別在于 CommonJS 只能用 exports 導(dǎo)出,而 CommonJS2 在 CommonJS 的基礎(chǔ)上增加了 module.exports 的導(dǎo)出方式。
在 output.libraryTarget 為 commonjs2 時(shí),配置 output.library 將沒有意義。
編寫的庫將通過 this 被賦值給通過 library 指定的名稱,輸出和使用的代碼如下:
// Webpack 輸出的代碼 this["LibraryName"] = lib_code; // 使用庫的方法 this.LibraryName.doSomething();5) window
編寫的庫將通過 window 被賦值給通過 library 指定的名稱,即把庫掛載到 window 上,輸出和使用的代碼如下:
// Webpack 輸出的代碼 window["LibraryName"] = lib_code; // 使用庫的方法 window.LibraryName.doSomething();6) global
編寫的庫將通過 global 被賦值給通過 library 指定的名稱,即把庫掛載到 global 上,輸出和使用的代碼如下:
// Webpack 輸出的代碼 global["LibraryName"] = lib_code; // 使用庫的方法 global.LibraryName.doSomething();三 HappyPack 1 action
HappyPack就能讓W(xué)ebpack把任務(wù)分解給多個(gè)子進(jìn)程去并發(fā)的執(zhí)行,子進(jìn)程處理完后再把結(jié)果發(fā)送給主進(jìn)程。
2 usageinstall
由于webpack 4.0 剛剛發(fā)布,響應(yīng)的插件還沒有更新完,不過可以在后面加一個(gè)@next來安裝即將發(fā)布的版本
npm i happypack@next -D
webpack.config.js
module: { rules: [ { test: /.css$/, use: "happypack/loader?id=css", //把對(duì).js文件的處理轉(zhuǎn)交給id為babel的HappyPack實(shí)例 //用唯一的標(biāo)識(shí)符id來代表當(dāng)前的HappyPack是用來處理一類特定文件 include: path.resolve("./src"), exclude: /node_modules/ }, { test: /.js/, use: "happypack/loader?id=babel", include: path.resolve("./src"), exclude: /node_modules/ } ] }, plugins: [ new HtmlWebPackPlugin({ template: "./src/index.html" }), new HappyPack({ id: "babel", loaders: ["babel-loader"]// 和rules里的配置相同 }), new HappyPack({ id: "css", loaders: ["style-loader", "css-loader"]// 和rules里的配置相同 }), ]四 ParallelUglifyPlugin 1.action
可以把對(duì)JS文件的串行壓縮變?yōu)殚_啟多個(gè)子進(jìn)程并行執(zhí)行
2 usageinsatll
npm install webpack-parallel-uglify-plugin -D
webpackage.config.js
new ParallelUglifyPlugin({ workerCount: os.cpus().length - 1,//開啟幾個(gè)子進(jìn)程去并發(fā)的執(zhí)行壓縮。默認(rèn)是當(dāng)前運(yùn)行電腦的 CPU 核數(shù)減去1 uglifyJS: { output: { beautify: false, //不需要格式化 comments: true, //不保留注釋 }, compress: { warnings: false, // 在UglifyJs刪除沒有用到的代碼時(shí)不輸出警告 drop_console: true, // 刪除所有的 `console` 語句,可以兼容ie瀏覽器 collapse_vars: true, // 內(nèi)嵌定義了但是只用到一次的變量 reduce_vars: true, // 提取出出現(xiàn)多次但是沒有定義成變量去引用的靜態(tài)值 } } })五 服務(wù)器自動(dòng)刷新 1 文件監(jiān)聽 1) action
可以監(jiān)聽文件變化,當(dāng)文件發(fā)生變化的時(shí)候重新編譯
2) useagewatch: true, watchOptions: { ignored: /node_modules/, aggregateTimeout: 300, poll: 1 }3) note
watch
只有在開啟監(jiān)聽模式時(shí)(watch為true),watchOptions才有意義
aggregateTimeout
監(jiān)聽到變化發(fā)生后等300(ms)再去執(zhí)行動(dòng)作,防止文件更新太快導(dǎo)致編譯頻率太高
poll
通過不停的詢問文件是否改變來判斷文件是否發(fā)生變化,默認(rèn)每秒詢問1000次
文件監(jiān)聽流程
webpack定時(shí)獲取文件的更新時(shí)間,并跟上次保存的時(shí)間進(jìn)行比對(duì),不一致就表示發(fā)生了變化,poll就用來配置每秒問多少次。
當(dāng)檢測文件不再發(fā)生變化,會(huì)先緩存起來,等等待一段時(shí)間后之后再通知監(jiān)聽者,這個(gè)等待時(shí)間通過aggregateTimeout配置。
webpack只會(huì)監(jiān)聽entry依賴的文件
我們需要盡可能減少需要監(jiān)聽的文件數(shù)量和檢查頻率,當(dāng)然頻率的降低會(huì)導(dǎo)致靈敏度下降。
devServer: { inline: true },2) note
webpack負(fù)責(zé)監(jiān)聽文件變化,webpack-dev-server負(fù)責(zé)刷新瀏覽器。這些文件會(huì)被打包到chunk中,它們會(huì)代理客戶端向服務(wù)器發(fā)起WebSocket連接
3 模塊熱替換 1) action模塊熱替換(Hot Module Replacement)的技術(shù)可在不刷新整個(gè)網(wǎng)頁的情況下只更新指定的模塊.
原理是當(dāng)一個(gè)源碼發(fā)生變化時(shí),只重新編譯發(fā)生變化的模塊,再用新輸出的模塊替換掉瀏覽器中對(duì)應(yīng)的老模塊
2) 優(yōu)點(diǎn)反應(yīng)更快,時(shí)間更短
不刷新網(wǎng)頁可以保留網(wǎng)頁運(yùn)行狀態(tài)
監(jiān)聽更少的文件
忽略掉 node_modules 目錄下的文件
2) usewebpack.config.js
devServer: { hot:true//將hot設(shè)置為true }, // 需要的插件 plugins: [ new webpack.NamedModulesPlugin(),//顯示模塊的相對(duì)路徑 new webpack.HotModuleReplacementPlugin()// 啟動(dòng)熱加載功能 ]
code
if (module.hot) { module.hot.accept("./hot.js", () => { let hot = require("./hot"); document.getElementById("app2").innerHTML = hot + "1"; }) }3 note
需要熱加載的模塊需要在初始化的時(shí)候引入到模塊中,否則不會(huì)觸發(fā)HMR。六 區(qū)分環(huán)境 1 action
在開發(fā)網(wǎng)頁的時(shí)候,一般都會(huì)有多套運(yùn)行環(huán)境,例如,在開發(fā)過程中方便開發(fā)調(diào)試的環(huán)境。發(fā)布到線上給用戶使用的運(yùn)行環(huán)境。
線上的環(huán)境和開發(fā)環(huán)境區(qū)別主要有以下不同:
線上的代碼被壓縮
開發(fā)環(huán)境可能會(huì)打印只有開發(fā)者才能看到的日志
開發(fā)環(huán)境和線上環(huán)境后端數(shù)據(jù)接口可能不同
2 usagepackage.json
cross-env跨平臺(tái)設(shè)置環(huán)境變量(后面沒有&&)
"scripts": { "build-dev": "cross-env NODE_ENV=development webpack --mode development", "build-prod": "cross-env NODE_ENV=production webpack --mode production" }
webpack.config.js
根據(jù)環(huán)境變量區(qū)分生產(chǎn)環(huán)境還是開發(fā)環(huán)境,然后和webpack.base.config.js合并,生產(chǎn)環(huán)境(或者開發(fā)環(huán)境)的優(yōu)先級(jí)高于webpack.base.config.js的配置。
let merge = require("webpack-merge"); let base = require("./webpack.base.config"); let other = null; if (process.env.NODE_ENV === "development") { other = require("./webpack.dev.config"); } else { other = require("./webapack.prod.config"); } module.exports = merge(base, other);
webpack.base.config.js
基本配置
webpack.DefinePlugin 定義環(huán)境變量
基本配置... plugins: [ new webpack.DefinePlugin({ __isDevelopment__: JSON.stringify(process.env.NODE_ENV == "development") }) ]
webpack.dev.config.js
以output舉例,如果開發(fā)和生產(chǎn)環(huán)境的參數(shù)不同,就會(huì)覆蓋webpack.base.config.js里面的配置
const path = require("path"); module.exports = { output: { path: path.resolve("./dist"), filename: "[name].dev.[hash:2].js" } };
webpack.prod.config.js
(以output舉例)
const path = require("path"); module.exports = { output: { path: path.resolve("./dist"), filename: "[name].prod.[hash:8].js" } };
base.js
配置文件中的webpack.DefinePlugin定義的變量(__isDevelopment__),在入口文件和入口文件引用的其他文件中都可以獲取到__isDevelopment__的值
let env = null; if (__isDevelopment__) { env = "dev"; } else { env = "prod"; } module.exports = env;
index.js
let env = require("./base.js"); if (__isDevelopment__) { console.log("dev"); } else { console.log("prod"); } console.log("env", env); /* prod env prod */3 note
webpack.DefinePlugin
定義環(huán)境變量的值時(shí)用 JSON.stringify 包裹字符串的原因是環(huán)境變量的值需要是一個(gè)由雙引號(hào)包裹的字符串,而 JSON.stringify("production")的值正好等于""production""
七 CDNCDN 又叫內(nèi)容分發(fā)網(wǎng)絡(luò),通過把資源部署到世界各地,用戶在訪問時(shí)按照就近原則從離用戶最近的服務(wù)器獲取資源,從而加速資源的獲取速度。
HTML文件不緩存,放在自己的服務(wù)器上,關(guān)閉自己服務(wù)器的緩存,靜態(tài)資源的URL變成指向CDN服務(wù)器的地址
靜態(tài)的JavaScript、CSS、圖片等文件開啟CDN和緩存,并且文件名帶上HASH值
為了并行加載不阻塞,把不同的靜態(tài)資源分配到不同的CDN服務(wù)器上
八 Tree Shaking 1 actiontree Shaking 可以用來剔除JavaScript中用不上的死代碼。
2 useage它依賴靜態(tài)的ES6模塊化語法,例如通過import和export導(dǎo)入導(dǎo)出
不要編譯ES6模塊
use: { loader: "babel-loader", query: { presets: [ [ "env", { modules: false //含義是關(guān)閉 Babel 的模塊轉(zhuǎn)換功能,保留原本的 ES6 模塊化語法 } ], "react" ] } },3 note
需要注意的是它依賴靜態(tài)的ES6模塊化語法,例如通過import和export導(dǎo)入導(dǎo)出。也就是說如果項(xiàng)目代碼運(yùn)行在不支持es6語法的環(huán)境上,Tree Shaking也就沒有意義了。
九 提取公共代碼 1 為什么需要提取公共代碼大網(wǎng)站有多個(gè)頁面,每個(gè)頁面由于采用相同技術(shù)棧和樣式代碼,會(huì)包含很多公共代碼,如果都包含進(jìn)來會(huì)有問題
相同的資源被重復(fù)的加載,浪費(fèi)用戶的流量和服務(wù)器的成本;
每個(gè)頁面需要加載的資源太大,導(dǎo)致網(wǎng)頁首屏加載緩慢,影響用戶體驗(yàn)。 如果能把公共代碼抽離成多帶帶文件進(jìn)行加載能進(jìn)行優(yōu)化,可以減少網(wǎng)絡(luò)傳輸流量,降低服務(wù)器成本
不同類型的文件,打包后的代碼塊也不同:
基礎(chǔ)類庫,方便長期緩存
頁面之間的公用代碼
各個(gè)頁面多帶帶生成文件
2) usagewebpack.config.js
optimization: { splitChunks: { cacheGroups: { commons: {// 頁面之間的公用代碼 chunks: "initial", minChunks: 2, maxInitialRequests: 5, // The default limit is too small to showcase the effect minSize: 0 // This is example is too small to create commons chunks }, vendor: {// 基礎(chǔ)類庫 chunks: "initial", test: /node_modules/, name: "vendor", priority: 10, enforce: true } } } },
./src/pageA.js
require("./utils/utility1.js"); require("./utils/utility2.js"); require("react");
./src/pageB.js
require("./utils/utility2.js"); require("./utils/utility3.js");
./src/pageC.js
require("./utils/utility2.js"); require("./utils/utility3.js");
utils/utility1.js
module.exports = 1;
utils/utility2.js
module.exports = 2;
utils/utility3.js
module.exports = 3;
打包后的結(jié)果
上述三種代碼的生成的結(jié)果,如下圖:
Scope Hoisting 可以讓 Webpack 打包出來的代碼文件更小、運(yùn)行的更快, 它又譯作 "作用域提升",是在 Webpack3 中新推出的功能。
代碼體積更小,因?yàn)楹瘮?shù)申明語句會(huì)產(chǎn)生大量代碼
代碼在運(yùn)行時(shí)因?yàn)閯?chuàng)建的函數(shù)作用域更少了,內(nèi)存開銷也隨之變小 hello.js
2 useagepackage.json
"build": "webpack --display-optimization-bailout --mode development",
webpack.config.js
plugins: [ new ModuleConcatenationPlugin() ],
./h.js
export default "scope hoist"
./index.js
import str from "./h.js" console.log(str);3 note
必須使用ES6語法,否則不起作用(--display-optimization-bailout 參數(shù)會(huì)提示)十一 代碼分離
代碼分離是 webpack 中最引人注目的特性之一。此特性能夠把代碼分離到不同的 bundle 中,然后可以按需加載或并行加載這些文件。 有三種常用的代碼分離方法:
入口起點(diǎn):使用 entry 配置手動(dòng)地分離代碼。
防止重復(fù):使用 splitChunks 去重和分離 chunk。
動(dòng)態(tài)導(dǎo)入:通過模塊的內(nèi)聯(lián)函數(shù)調(diào)用來分離代碼。
入口起點(diǎn)和防止重復(fù)上面已經(jīng)提到了,下面我們重點(diǎn)講一下動(dòng)態(tài)導(dǎo)入
1 action用戶當(dāng)前需要用什么功能就只加載這個(gè)功能對(duì)應(yīng)的代碼,也就是所謂的按需加載 在給單頁應(yīng)用做按需加載優(yōu)化時(shí),一般采用以下原則:
對(duì)網(wǎng)站功能進(jìn)行劃分,每一類一個(gè)chunk
對(duì)于首次打開頁面需要的功能直接加載,盡快展示給用戶
某些依賴大量代碼的功能點(diǎn)可以按需加載
被分割出去的代碼需要一個(gè)按需加載的時(shí)機(jī)
2 usage使用import(module)的語法
import 異步 加載 模塊是一個(gè)es7的語法
在webpack里import是一個(gè)天然的分割點(diǎn)
document.getElementById("play").addEventListener("click",function(){ import("./vedio.js").then(function(video){ let name = video.getName(); console.log(name); }); });參考文檔
webpack官方文檔
webpack官方文檔中文版
webpackGitHub
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/93904.html
摘要:剛剛發(fā)布,官網(wǎng)自稱最大的特點(diǎn)就是零配置。本文就詳細(xì)介紹一下實(shí)戰(zhàn)那些事兒。自動(dòng)刷新監(jiān)聽本地源代碼的變化,自動(dòng)重新構(gòu)建刷新瀏覽器。自動(dòng)發(fā)布更新完代碼后,自動(dòng)構(gòu)建出線上發(fā)布代碼并傳輸給發(fā)布系統(tǒng)。代碼塊,一個(gè)由多個(gè)模塊組合而成,用于代碼合并與分割。 webpack4.0剛剛發(fā)布,官網(wǎng)自稱4.0最大的特點(diǎn)就是零配置。本文就詳細(xì)介紹一下webpack4.0實(shí)戰(zhàn)那些事兒。 1 什么是WebPack ...
摘要:我們發(fā)布了新版本的插件系統(tǒng),以便事件掛鉤和處理程序是單態(tài)的。倒計(jì)時(shí)按照承諾,我們將從今天開始等待一個(gè)月,然后再釋放穩(wěn)定版。這為我們的插件,加載程序和集成生態(tài)系統(tǒng)提供了測試,報(bào)告和升級(jí)到的時(shí)間我們需要您幫助我們升級(jí)并測試此測試版。 自8月初以來—當(dāng)我們將 nex branch?合并到webpack/webpack#master—我們看到了巨大的貢獻(xiàn)! showImg(https://se...
摘要:本文是到家技術(shù)總監(jiān)沈劍在北京站上的演講視頻。全面解析單點(diǎn)系統(tǒng)的可用性架構(gòu)與優(yōu)化消息系統(tǒng)的可達(dá)性架構(gòu)與優(yōu)化事務(wù)系統(tǒng)的一致性架構(gòu)與優(yōu)化。時(shí)長分鐘,建議收藏和轉(zhuǎn)發(fā)后在環(huán)境下觀看。沈劍到家技術(shù)總監(jiān),互聯(lián)網(wǎng)架構(gòu)技術(shù)專家,架構(gòu)師之路公眾號(hào)作者。 showImg(https://segmentfault.com/img/bVz49R);本文是58到家技術(shù)總監(jiān)沈劍在MPD2016 北京站上的演講視頻。...
摘要:要快,但是我們的服務(wù)也必須萬無一失,后續(xù)我會(huì)分享百度移動(dòng)端首頁的前端架構(gòu)設(shè)計(jì)那么這樣的優(yōu)化,是如何做到的呢,又如何兼顧穩(wěn)定性,架構(gòu)性,與速度呢別急,讓我們把這些優(yōu)化一一道來。百度移動(dòng)端首頁的很多就是這樣緩存在客戶端的。 歡迎大家收看聊一聊系列,這一套系列文章,可以幫助前端工程師們了解前端的方方面面(不僅僅是代碼):https://segmentfault.com/blog/fronte...
閱讀 3035·2021-11-24 09:39
閱讀 2273·2021-10-08 10:05
閱讀 2764·2021-09-24 13:52
閱讀 1582·2021-09-22 15:07
閱讀 601·2019-08-30 15:55
閱讀 1819·2019-08-30 15:53
閱讀 699·2019-08-30 15:44
閱讀 3129·2019-08-30 11:20