摘要:關(guān)于這個(gè)單頁(yè)面應(yīng)用大家可以直接去我的上查看,我將結(jié)合這個(gè)項(xiàng)目去介紹。
這篇文章將介紹如何利用 webpack 進(jìn)行單頁(yè)面應(yīng)用的開(kāi)發(fā),算是我在實(shí)際開(kāi)發(fā)中的一些心得和體會(huì),在這里給大家做一個(gè)分享。webpack 的介紹這里就不多說(shuō)了,可以直接去官網(wǎng)查看。 關(guān)于這個(gè)單頁(yè)面應(yīng)用大家可以直接去我的github上查看https://github.com/huangshuwei/webpackForSPA,我將結(jié)合這個(gè)項(xiàng)目去介紹。如果大家覺(jué)得這篇文章有不妥的地方,還請(qǐng)指出。
項(xiàng)目目錄這篇文章的目的是解決我們?cè)陂_(kāi)發(fā)中會(huì)遇到的問(wèn)題,不是一篇基礎(chǔ)教程,還請(qǐng)諒解。
我將根據(jù)這個(gè)目錄結(jié)構(gòu)進(jìn)行講解
dist:發(fā)布的文件目錄,即webpack編譯輸出的目錄
libs:放置公共的文件,如js、css、img、font等
mockServer:模擬后端服務(wù),即用webpack開(kāi)發(fā)時(shí)模擬調(diào)用的后端服務(wù)(用nodejs服務(wù)模擬)
node_modules:項(xiàng)目依賴(lài)的包
src:資源文件,里面包含css、font、html、img、js
package.json:項(xiàng)目配置
webpack.config.js:webpack的配置文件
項(xiàng)目的使用建議先運(yùn)行一下這個(gè)項(xiàng)目,有一個(gè)大致的了解,再往下閱讀。使用說(shuō)明:
首先克隆一份到你的本地 $ git clone https://github.com/huangshuwei/webpackForSPA.git 然后 cd 到 ‘webpackForSPA’目錄下 $ cd webpackForSPA 接著你可以運(yùn)行不同的命令查看結(jié)果 發(fā)布模式: $ npm run build 開(kāi)發(fā)模式: $ npm run dev 熱更新模式 $ npm run dev-hrm 如果使用了熱更新模式,并且想要結(jié)合后端服務(wù)形式運(yùn)行,那么cd 到‘mockServer’目錄下,并執(zhí)行node 服務(wù): $ cd mockServer $ node server.js區(qū)分開(kāi)發(fā)、熱更新、發(fā)布模式
一般開(kāi)發(fā)時(shí)和發(fā)布時(shí)是不同的,比如開(kāi)發(fā)時(shí)文件的訪問(wèn)目錄包含‘dist’目錄,但是發(fā)布上線時(shí),一般會(huì)把‘dist’文件夾去掉。
當(dāng)然還有其他的一些細(xì)節(jié)不同。
開(kāi)發(fā)模式:
能看到webpack編譯輸出的文件
js、css、html文件不需要壓縮
可以正確的運(yùn)行編譯輸出后的文件
這種模式一般只是用來(lái)看webpack編譯輸出后的文件是否正確
熱更新模式:
看不到webpack編譯輸出的文件
js、css、html文件不需要壓縮
更改完文件后無(wú)需重新編譯并自動(dòng)刷新瀏覽器
可以結(jié)合后端服務(wù)開(kāi)發(fā),避過(guò)瀏覽器同源策略,如結(jié)合java、.net服務(wù)等
發(fā)布模式:
能看到webpack編譯輸出的文件
js、css、html文件壓縮
文件的層級(jí)目錄不需要包含‘dist’目錄
我區(qū)分開(kāi)發(fā)、熱更新、發(fā)布模式是通過(guò)配置‘package.json’文件的運(yùn)行命令,有些人是通過(guò)創(chuàng)建多個(gè)不同的webpack的配置文件來(lái)達(dá)到想要的效果。
像這個(gè)項(xiàng)目就是使用了多個(gè)webpack的配置文件。
配置命令這是在 package.json 文件中配置的
// package.json 文件 ... "scripts": { "build": "webpack --profile --progress --colors --display-error-details", "dev": "webpack --display-modules --profile --progress --colors --display-error-details", "dev-hrm": "webpack-dev-server --config" }, ...
color 輸出結(jié)果帶彩色,比如:會(huì)用紅色顯示耗時(shí)較長(zhǎng)的步驟
profile 輸出性能數(shù)據(jù),可以看到每一步的耗時(shí)
progress 輸出當(dāng)前編譯的進(jìn)度,以百分比的形式呈現(xiàn)
display-modules 默認(rèn)情況下 node_modules 下的模塊會(huì)被隱藏,加上這個(gè)參數(shù)可以顯示這些被隱藏的模塊
display-error-details 輸出詳細(xì)的錯(cuò)誤信息
webpack-dev-server 將會(huì)開(kāi)啟熱更新
更多請(qǐng)參考官網(wǎng) cli
配置好了package.json文件,我們就可以這樣運(yùn)行
// 開(kāi)發(fā)模式 npm run dev // 熱更新模式 npm run dev-hrm // 發(fā)布模式 npm run build配置變量標(biāo)識(shí)
配置完了命令,當(dāng)我們運(yùn)行不同的命令時(shí),我們可以通過(guò)‘process.env.npm_lifecycle_event’去獲取當(dāng)前運(yùn)行的命令,根據(jù)不同的命令,我們可以按照自己的需要做相應(yīng)的處理。比如開(kāi)發(fā)模式時(shí),允許開(kāi)啟調(diào)試,靜態(tài)資源不要壓縮;發(fā)布模式時(shí),不允許調(diào)試,靜態(tài)資源要壓縮。具體如下:
// webpack.config.js // 獲取當(dāng)前運(yùn)行的模式 var currentTarget = process.env.npm_lifecycle_event; var debug, // 是否是調(diào)試 devServer, // 是否是熱更新模式 minimize; // 是否需要壓縮 if (currentTarget == "build") { // 發(fā)布模式 debug = false, devServer = false, minimize = true; } else if (currentTarget == "dev") { // 開(kāi)發(fā)模式 debug = true, devServer = false, minimize = false; } else if (currentTarget == "dev-hrm") { // 熱更新模式 debug = true, devServer = true, minimize = false; }基礎(chǔ)配置 配置路徑
為了方便我們頻繁使用路徑,如下配置
// webpack.config.js var PATHS = { // 發(fā)布目錄 publicPath: debug ? "/webpackForSPA/dist/" : "/webpackForSPA/", // 公共資源目錄 libsPath: path.resolve(process.cwd(), "./libs"), // src 資源目錄 srcPath: path.resolve(process.cwd(), "src"), }配置別名
webpack的別名的目的就是簡(jiǎn)化我們的操作,引用資源時(shí)直接使用別名即可(和 seajs 里的別名用法一樣)。配置如下:
// webpack.config.js ... resolve:{ alias: { // js jquery: path.join(PATHS.libsPath, "js/jquery/jquery"), underscore: path.join(PATHS.libsPath, "js/underscore/underscore.js"), // css bootstrapcss: path.join(PATHS.libsPath, "css/bootstrap/bootstrap-3.3.5.css"), indexcss: path.join(PATHS.srcPath, "css/index.css"), } } ...配置webpack編譯入口
// webpack.config.js ... entry:{ // 入口 js index: "./src/js/index.js", // 公共js包含的文件 common: [ path.join(PATHS.libsPath, "js/jquery/jquery.js"), path.join(PATHS.libsPath, "js/underscore/underscore.js") ], } ...配置webpack編譯輸出
// webpack.config.js ... output:{ // 輸出目錄 path: path.join(__dirname, "dist"), // 發(fā)布后,資源的引用目錄 publicPath: PATHS.publicPath, // 文件名稱(chēng) filename: "js/[name].js", // 按需加載模塊時(shí)輸出的文件名稱(chēng) chunkFilename: "js/[name].js" } ...提取css到多帶帶的文件
當(dāng)我們?cè)趈s文件中通過(guò)require("")引用js時(shí),webpack 默認(rèn)會(huì)將css文件與當(dāng)前js文件打包一起,但是這種方式會(huì)阻塞頁(yè)面的加載,因?yàn)閏ss的執(zhí)行要等待js文件加載進(jìn)來(lái)。所以我們會(huì)把css從js文件中提取出來(lái),放到一個(gè)多帶帶的css文件中。這時(shí)我們要使用webpack的插件:extract-text-webpack-plugin,配置如下:
引入插件
// webpack.config.js var ExtractTextPlugin = require("extract-text-webpack-plugin");
配置 loader
// webpack.config.js ... loaders: [ { test: /.css$/, loader: ExtractTextPlugin.extract("style-loader", "css-loader!postcss-loader") }, ... ] ...
配置 plugins
// webpack.config.js ... plugins:[ new ExtractTextPlugin("css/[name].css", {allChunks: true}), ... ] ...公共js打包
項(xiàng)目中,我們通常會(huì)有公共的js,比如 jquery、bootstrap、underscore 等,那么這時(shí)候我們需要將這些公共的js多帶帶打包。這時(shí)我們需要用webpack自帶的插件:
// webpack.config.js ... plugins:[ // 會(huì)把 ‘entry’ 定義的 common 對(duì)應(yīng)的兩個(gè)js 打包為 ‘common.js’ new webpack.optimize.CommonsChunkPlugin("common", "js/[name].js", Infinity), ] ...資源添加版本號(hào)
項(xiàng)目上線后,資源的版本號(hào)十分重要。資源沒(méi)有版本號(hào),即使重新發(fā)布,客戶端瀏覽器可能會(huì)把老的資源緩存下來(lái),導(dǎo)致無(wú)法下載最新的資源。webpack 支持給資源添加版本號(hào),不僅僅是js、css,甚至font、img都可以添加版本號(hào)。我們可以通過(guò)webpack中的‘chunkhash’來(lái)解決。
首先要了解下webpack 中 [hash]、[chunkhash]、[chunkhash:8]的區(qū)別。
[hash]:webpack編譯會(huì)產(chǎn)生一個(gè)hash值
[chunkhash]:每個(gè)模塊的hash值
[chunkhash:8]:取[chunkhash]的前8位
推薦發(fā)布模式使用版本號(hào),其他模式無(wú)需使用,熱更新模式不支持‘chunkhash’,但是支持‘hash’
資源加版本號(hào),那么我們的輸出的部分都要做改動(dòng),并且要區(qū)分當(dāng)前的命令模式,如下:
// webpack.config.js ... output:{ // 輸出目錄 path: path.join(__dirname, "dist"), // 發(fā)布后,資源的引用目錄 publicPath: PATHS.publicPath, // 文件名稱(chēng) filename: devServer ? "js/[name].js" : "js/[name]-[chunkhash:8].js", // 按需加載模塊時(shí)輸出的文件名稱(chēng) chunkFilename: devServer ? "js/[name].js" : "js/[name]-[chunkhash:8].js" } ...
輸出公共js的地方也要改動(dòng):
// webpack.config.js ... plugins:[ // 會(huì)把 ‘entry’ 定義的 common 對(duì)應(yīng)的兩個(gè)js 打包為 ‘common.js’ new webpack.optimize.CommonsChunkPlugin("common", "" + (devServer ? "js/[name].js" : "js/[name]-[chunkhash:8].js"), Infinity), ] ...頁(yè)面自動(dòng)引入含有版本號(hào)的文件
有個(gè)版本號(hào)后,我們考慮如何通過(guò)html引用這些含有版本號(hào)的js、css、font、img。webpack每次編譯后的資源 chunkhash 會(huì)隨著內(nèi)容的變化而變化,所以我們不可能每次都手動(dòng)的更改html這些資源的引用路徑。這時(shí)我們要用到webpack的插件:html-webpack-plugin。這個(gè)插件的目的是生成html,也可以根據(jù)模板生成html,當(dāng)然還有其他的功能,具體看插件介紹。下面是的配置:
引入插件
// webpack.config.js var HtmlWebpackPlugin = require("html-webpack-plugin");
配置 plugins,生成需要的html
// webpack.config.js ... plugins:[ new HtmlWebpackPlugin({ filename: "index.html", template: __dirname + "/src/index.html", inject: "true" }), new HtmlWebpackPlugin({ filename: "html/hrm.html", template: __dirname + "/src/html/hrm.html", inject: false, }), new HtmlWebpackPlugin({ filename: "html/home.html", template: __dirname + "/src/html/home.html", inject: false, }), ] ...
我們前面說(shuō)過(guò),webpack 默認(rèn)只識(shí)別 js 文件,所以對(duì)于html也要使用對(duì)應(yīng)的loader:
// webpack.config.js ... loaders:[ {test: /.html$/,loader: "html"}, ] ...引用圖片和字體
引用圖片和字體,需要對(duì)應(yīng)的loader,并且可以設(shè)置這些資源大小的臨界值,當(dāng)小于臨界值的時(shí)候,字體或者圖片文件會(huì)以base64的形式在html引用,否則則是以資源路徑的形式引用。如下:
// webpack.config.js // 圖片 loader { test: /.(png|gif|jpe?g)$/, loader: "url-loader", query: { /* * limit=10000 : 10kb * 圖片大小小于10kb 采用內(nèi)聯(lián)的形式,否則輸出圖片 * */ limit: 10000, name: "/img/[name]-[hash:8].[ext]" } }, // 字體loader { test: /.(eot|woff|woff2|ttf|svg)$/, loader: "url-loader", query: { limit: 5000, name: "/font/[name]-[hash:8].[ext]" } },資源文件的壓縮
js、css、html的壓縮是少不了的,webpack 自帶了壓縮插件,如果某些對(duì)象名稱(chēng)不想被壓縮,可以排除不想要壓縮的對(duì)象名稱(chēng)。配置如下:
// webpack.config.js ... plugins:[ new webpack.optimize.UglifyJsPlugin({ mangle: { // 排除不想要壓縮的對(duì)象名稱(chēng) except: ["$super", "$", "exports", "require", "module", "_"] }, compress: { warnings: false }, output: { comments: false, } }) ] ...使用jquery、underscore
通過(guò)webpack編譯輸出后的項(xiàng)目中,雖然頁(yè)面已經(jīng)引用了jquery、underscore,但是還是無(wú)法直接使用‘$’、‘_’對(duì)象,我們可以這樣:
var $ = require("jquery"); var _ = require("underscore");
但是這樣實(shí)在不方便,如果我們就是要使用‘$’、‘_’對(duì)象直接操作,webpack 內(nèi)置的插件可以幫我們解決。具體如下:
// webpack.config.js new webpack.ProvidePlugin({ $: "jquery", jQuery: "jquery", "window.jQuery": "jquery", "_": "underscore", }),代碼分割,按需加載
在單頁(yè)面應(yīng)用中,當(dāng)我們加載其他的模板文件時(shí),想要引用這個(gè)模板文件對(duì)應(yīng)的js。如果我們通過(guò)這種方式require(),那么webpack會(huì)將這個(gè)模板文件對(duì)應(yīng)的js也會(huì)和當(dāng)前js打包成一個(gè)js。如果項(xiàng)目比較大,那么js文件也將越來(lái)越大。我們希望的是加載模板文件的時(shí)候動(dòng)態(tài)的引用這個(gè)模板文件對(duì)應(yīng)的js。那么我們可以通過(guò) require.ensure()的方式。
比如現(xiàn)在有兩個(gè)導(dǎo)航菜單:
我們給這兩個(gè)菜單綁定點(diǎn)擊事件,當(dāng)點(diǎn)擊‘home’時(shí)引用對(duì)應(yīng)的‘home.js’;當(dāng)點(diǎn)擊‘HRM’時(shí)引用對(duì)應(yīng)的‘hrm.js’,那么大致可以這樣:
function loadJs(jsPath) { var currentMod; if (jsPath === "./home") { require.ensure([], function (require) { currentMod = require("./home"); }, "home"); } else if (jsPath === "./hrm") { require.ensure([], function (require) { currentMod = require("./hrm"); }, "hrm"); } }全局環(huán)境變量
有時(shí)我們只有在開(kāi)發(fā)過(guò)程中,才想輸出log日志??梢杂靡韵聎ebpack內(nèi)置的插件解決:
// webpack.config.js ... plugins:[ new webpack.DefinePlugin({ // 全局debug標(biāo)識(shí) __DEV__: debug, }), ] ...
這時(shí)代碼中就可以這么寫(xiě)了:
if (__DEV__) { console.log("debug 模式"); }清空發(fā)布目錄
發(fā)布前清空發(fā)布目錄是有必要的,我們可以通過(guò)‘clean-webpack-plugin’插件解決:
引入插件:
// webpack.config.js var CleanWebpackPlugin = require("clean-webpack-plugin");
配置plugins:
// webpack.config.js ... plugins:[ new CleanWebpackPlugin(["dist"], { root: "", // An absolute path for the root of webpack.config.js verbose: true,// Write logs to console. dry: false // Do not delete anything, good for testing. }), ] ...熱更新結(jié)合后端服務(wù) 熱更新
熱更新可以在你代碼改變的時(shí)候即時(shí)編譯輸出,不用每次都要從都重新編譯一遍,并且除了第一次編譯比較慢,后面的編譯都是增量編譯,速度很快。有了這個(gè)功能,我們就不需要,每次都從頭編譯一次了。配置如下:
// webpack.config.js ... plugins: [ // Enable multi-pass compilation for enhanced performance // in larger projects. Good default. new webpack.HotModuleReplacementPlugin({ multiStep: true }), ], devServer: { // Enable history API fallback so HTML5 History API based // routing works. This is a good default that will come // in handy in more complicated setups. historyApiFallback: true, // Unlike the cli flag, this doesn"t set // HotModuleReplacementPlugin! hot: true, inline: true, // Display only errors to reduce the amount of output. stats: "errors-only", host: "localhost", // Defaults to `localhost` process.env.HOST port: "8080", // Defaults to 8080 process.env.PORT } ...
這時(shí)我們只要打開(kāi)瀏覽器,輸入:localhost:8080/ 就能看到結(jié)果,并且在你修改某些源文件后,瀏覽器會(huì)自動(dòng)刷新,就能看到webpack 即時(shí)編譯輸出的結(jié)果,而不需要重新編譯。
結(jié)合后端服務(wù)我們?cè)谑褂脀ebpack開(kāi)發(fā)時(shí)難免要結(jié)合后端服務(wù)開(kāi)發(fā),比如我們用webstorm 編譯器開(kāi)發(fā)項(xiàng)目,需要調(diào)用java的服務(wù),由于有同源策略問(wèn)題,這時(shí)我們會(huì)收到相關(guān)報(bào)錯(cuò)信息。這時(shí)我們可以通過(guò)代理的方式繞過(guò)同源策略。
這里我用nodejs 模擬一個(gè)后端服務(wù),如下:
// ~/mockServer/server.js var http = require("http"); var content = "▍if you see that,It means you have get the correct data by backend server(mock data by nodejs server)!"; var srv = http.createServer(function (req, res) { res.writeHead(200, {"Content-Type": "application/text"}); res.end(content); }); srv.listen(8888, function() { console.log("listening on localhost:8888"); });
接下來(lái)我們需要這樣配置去調(diào)用這個(gè)nodejs 的服務(wù)。
首先將熱更新配置的代碼修改為:
// webpack.config.js ... plugins: [ // Enable multi-pass compilation for enhanced performance // in larger projects. Good default. new webpack.HotModuleReplacementPlugin({ multiStep: true }), ], devServer: { // Enable history API fallback so HTML5 History API based // routing works. This is a good default that will come // in handy in more complicated setups. historyApiFallback: true, // Unlike the cli flag, this doesn"t set // HotModuleReplacementPlugin! hot: true, inline: true, // Display only errors to reduce the amount of output. stats: "errors-only", host: "localhost", // Defaults to `localhost` process.env.HOST port: "8080", // Defaults to 8080 process.env.PORT proxy: { "/devApi/*": { target: "http://localhost:8888/", secure: true, /* * rewrite 的方式擴(kuò)展性更強(qiáng),不限制服務(wù)的名稱(chēng) * */ rewrite: function (req) { req.url = req.url.replace(/^/devApi/, ""); } } } } ...
然后配置一個(gè)全局的環(huán)境變量,通過(guò)DefinePlugin:
// webpack.config.js ... plugins: [ new webpack.DefinePlugin({ __DEVAPI__: devServer ? "/devApi/" : """", }), ] ...
最后在調(diào)用服務(wù)的地方,只需要在調(diào)用地址前添加 __DEVAPI__全局環(huán)境變量即可,如:
$.ajax({ url: __DEVAPI__ + "http://localhost:8888/", data: {}, type: "get", dataType: "text", success: function (text) {} })
這樣在熱更新的模式下,當(dāng)有__DEVAPI__ 的地方就會(huì)自動(dòng)識(shí)別為/devApi/,而這里會(huì)通過(guò)代理處理幫你重寫(xiě)掉,繞過(guò)同源策略。
自動(dòng)打開(kāi)瀏覽器雖然以上的工作幾乎已經(jīng)滿足我們對(duì)webpack的要求了,但是我們還想懶一點(diǎn),想在熱更新模式下,編譯完成后自動(dòng)打開(kāi)瀏覽器。那么我們可以通過(guò)這個(gè)插件open-browser-webpack-plugin解決:
引用插件
// webpack.config.js var OpenBrowserPlugin = require("open-browser-webpack-plugin");
配置插件,這個(gè)配置要根據(jù)項(xiàng)目的具體情況去配置:
// webpack.config.js ... plugins: [ new OpenBrowserPlugin({url: "http://localhost:8080" + PATHS.publicPath + "index.html"}) ] ...總結(jié)
以上就是這篇文章的主要內(nèi)容,希望通過(guò)這篇文章能夠給大家?guī)?lái)一些啟發(fā)。如果有覺(jué)得哪里不對(duì),或者不合理的地方,歡迎指出。其實(shí)webpack還有一個(gè)關(guān)于版本號(hào)的bug,不知道是不是有人解決了,如果有人已經(jīng)解決了,還請(qǐng)分享。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/79887.html
摘要:本文相關(guān)代碼已經(jīng)存放在,可自行下載使用多入口復(fù)習(xí)的優(yōu)勢(shì)不言而喻,因此在實(shí)際應(yīng)用中我們也常常使用它調(diào)試多入口應(yīng)用,所謂多入口是指多個(gè)頁(yè)面會(huì)使用多個(gè)入口文件,在官方教程介紹了如何配置這里指定了個(gè)入口文件,打包之后分別會(huì)在文件夾中生成個(gè)打包之后 本文相關(guān)代碼已經(jīng)存放在 dynamic-entry,可自行下載使用 0. 多入口 (復(fù)習(xí)) webpack 的優(yōu)勢(shì)不言而喻,因此在實(shí)際應(yīng)用中我們也常...
摘要:原作者原鏈接基于多入口生成模板用于服務(wù)端渲染的方案及實(shí)戰(zhàn)法律聲明警告本作品遵循署名非商業(yè)性使用禁止演繹未本地化版本協(xié)議發(fā)布。這是什么背景現(xiàn)代化的前端項(xiàng)目中很多都使用了客戶端渲染的單頁(yè)面應(yīng)用。 原作者:@LinuxerPHL原鏈接:基于 Webpack 4 多入口生成模板用于服務(wù)端渲染的方案及實(shí)戰(zhàn) 法律聲明 警告:本作品遵循 署名-非商業(yè)性使用-禁止演繹3.0 未本地化版本(CC BY-...
摘要:原作者原博文地址基于多入口生成模板用于服務(wù)端渲染的方案及實(shí)戰(zhàn)法律聲明警告本作品遵循署名非商業(yè)性使用禁止演繹未本地化版本協(xié)議發(fā)布。這是什么背景現(xiàn)代化的前端項(xiàng)目中很多都使用了客戶端渲染的單頁(yè)面應(yīng)用。 原作者:@LinuxerPHL原博文地址: 基于 Webpack 4 多入口生成模板用于服務(wù)端渲染的方案及實(shí)戰(zhàn) 法律聲明 警告:本作品遵循 署名-非商業(yè)性使用-禁止演繹3.0 未本地化版本(...
摘要:特性比較熱門(mén)的兩大特性,零配置和速度快號(hào)稱(chēng)提速上限一般情況下,相比于低版本,場(chǎng)景下第三方依賴(lài)打包速度和場(chǎng)景下本地服務(wù)首次啟動(dòng)速度都得到顯著提升零配置通過(guò)指定當(dāng)前場(chǎng)景為開(kāi)發(fā)模式還是生產(chǎn)模式,自動(dòng)設(shè)置好當(dāng)前場(chǎng)景的默認(rèn)配置,用戶即可馬上使用,不需 webpack4特性 webpack4比較熱門(mén)的兩大特性,零配置和速度快(號(hào)稱(chēng)提速上限98%) 一般情況下,webpack4相比于低版本,prod...
摘要:原因就是默認(rèn)會(huì)把最重要的東西放到公共里,這里面包含啟動(dòng)應(yīng)用程序的依賴(lài)項(xiàng)模塊與模塊的依賴(lài)關(guān)系以及文件的版本號(hào)等信息。 之前寫(xiě)了一篇關(guān)于webpack 如何使用的文章:webpack 單頁(yè)面應(yīng)用實(shí)戰(zhàn),并且寫(xiě)了一個(gè) 單頁(yè)面應(yīng)用的小項(xiàng)目 放到了github上。正巧公司前段時(shí)間用webpack 做了一個(gè)項(xiàng)目,項(xiàng)目不大,是基于單頁(yè)面應(yīng)用的。但是上線后才發(fā)現(xiàn)了一些問(wèn)題,原來(lái)還是有一些要優(yōu)化改進(jìn)的地方...
閱讀 1030·2023-04-25 14:45
閱讀 2834·2021-09-30 09:59
閱讀 3161·2021-09-22 15:48
閱讀 2449·2019-08-30 15:55
閱讀 3519·2019-08-30 15:44
閱讀 569·2019-08-29 14:07
閱讀 3441·2019-08-26 13:45
閱讀 564·2019-08-26 11:31