摘要:假設后臺使用端口,我們使用模式需要如下配置現在可以啟動服務了,但同時請求也要修改為這樣才能進行熱加載。
webpack 提供了 webpack-dev-server 可以實現高效的頁面自動刷新,但是這個 server 有一點局限性:
雖然可以做為 server 中間件使用,但本身不提供其它資源的靜態服務
對于打包文件以外的變化它是無知的,也就無法去刷新
如果是自己的頁面需要引入 script,修改配置 entry,自己另外提供文件服務,步驟繁瑣
現在假設我們有自己的 html 頁面,頁面引入了本地的 css,但是 js 是由 webpack 打包的,需要實現文件修改自動刷新的頁面的話我們需要以下幾個模塊:
文件監視 - gulp.watch()
靜態資源服務 - gulp-serve 模塊
livereload服務 (負責接受變化請求并通知頁面刷新) - gulp-livereload 模塊
自動添加 livereload 前端腳本 - connect-livereload 模塊 (或者使用livereload瀏覽器插件)
代碼如下:
// npm i gulp-serve gulp-livereload webpack gulp-util gulp connect-livereload -D var serve = require("gulp-serve") var livereload = require("gulp-livereload") var webpack = require("webpack") var gutil = require("gulp-util") var gulp = require("gulp") var webpackConfig = require("./webpack.config.js") var inject = require("connect-livereload")() var path = require("path") var myConfig = Object.create(webpackConfig) // for debugging myConfig.devtool = "sourcemap" myConfig.debug = true var paths = { scripts: ["index.js"], // file list for watching asserts: ["*.css", "index.html"] } gulp.task("default", ["build-dev"]) gulp.task("build-dev", ["webpack:build-dev", "serve"], function () { livereload.listen({ start: true }) // build js files on change gulp.watch(paths.scripts, ["webpack:build-dev"]) var watcher = gulp.watch(paths.asserts) watcher.on("change", function (e) { livereload.changed(e.path) }) }) // static server gulp.task("serve", serve({ root: [__dirname], // inject livereload script ot html middleware: inject })) var devCompiler = webpack(myConfig) var outputFile = path.resolve(myConfig.output.path, myConfig.output.filename) gulp.task("webpack:build-dev", function (callback) { devCompiler.run(function (err, stats) { if (err) throw new gutil.pluginError("webpack:build-dev", err) //eslint-disable-line gutil.log("[webpack:build-dev]", stats.toString({ colors: true })) livereload.changed(outputFile) callback() }) })
這種做法最大的好處就是 html 和 css 不用都讓 webpack 去處理也能做到自動刷新,但是相比 webpack-dev-server, 它是JS全部重新打包的,所以性能會差很多,此時我們可以使用 webpack-dev-server 實現打包文件的監聽,同時讓原來后臺提供其它文件服務。假設后臺使用 3000 端口,我們使用 webpack-dev-server inline模式需要如下配置:
gulp.task("webpack:dev-server", function () { var devServerConfig = Object.create(myConfig) // webpack need this to send request to webpack-dev-server devServerConfig.output.publicPath = "http://localhost:8080/" devServerConfig.plugins = devServerConfig.plugins || [] devServerConfig.plugins.push(new webpack.HotModuleReplacementPlugin()) // inline mode devServerConfig.entry.unshift("webpack-dev-server/client?http://localhost:8080", "webpack/hot/dev-server") var compiler = webpack(devServerConfig) new WebpackDevServer(compiler, { contentBase: "http://localhost:3000/", // Set this as true if you want to access dev server from arbitrary url. // This is handy if you are using a html5 router. historyApiFallback: false, // Don"t forget this for dev-server publicPath: "/build/", lazy: false, hot: true }).listen(8080, "localhost", function (err) { if (err) throw new gutil.PluginError("webpack-dev-server", err) // Server listening gutil.log("[webpack-dev-server]", "http://localhost:8080/") }) })
gulp webpack:dev-server 現在可以啟動服務了,但同時請求 bundle.js script也要修改為:
這樣 webpack-dev-server 才能進行熱加載。
還有一種看起來更好的方式是使用 proxy 來代理,此時你訪問 webpack-dev-server時它無法處理的請求都會轉發給你的后臺服務,配置起來相比上面要簡單一些:
html 頁面無需修改
config.output.publicPath 使用原來的相對路徑
webpack-dev-server 配置 proxy 選項
gulp.task("webpack:dev-server", function () { var devServerConfig = Object.create(myConfig) // webpack need this to send request to webpack-dev-server devServerConfig.plugins = devServerConfig.plugins || [] devServerConfig.plugins.push(new webpack.HotModuleReplacementPlugin()) // inline mode devServerConfig.entry.unshift("webpack-dev-server/client?http://localhost:8080", "webpack/hot/dev-server") var compiler = webpack(devServerConfig) new WebpackDevServer(compiler, { // contentBase: {target: "http://localhost:3000/"}, // Set this as true if you want to access dev server from arbitrary url. // This is handy if you are using a html5 router. historyApiFallback: false, proxy: { "*": "http://localhost:3000" }, publicPath: "/build/", lazy: false, hot: true }).listen(8080, "localhost", function (err) { if (err) throw new gutil.PluginError("webpack-dev-server", err) // Server listening gutil.log("[webpack-dev-server]", "http://localhost:8080/") }) })
這么做只需要訪問 webpack-dev-server 就可以直接訪問頁面,其它設備通過 ip 也能直接訪問到,免去了修改的麻煩。其實 webpack-dev-server 如果可以直接添加靜態文件服務的功能,我們有時就不必折騰的這么麻煩了,大概是作者不想破壞它功能上的簡潔以及避免濫用導致不良的后果吧。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/86085.html
摘要:但是,從長遠來看,尤其是多人協作的項目,還是很有必要的。第二參數為了某些場景下要大寫強調,只需要傳入即可自動將結果轉成大寫。這個有可能是業務上線了之后才發生,直接導致業務不可用。而這也被證明是個好的編碼方式。 只是抱著嘗試的心態對項目進行了遷移,體驗了一番typeScript的強大,當然,習慣了JavaScript的靈活,弱類型,剛用上typeScript時會很不適應,猶如懶散慣了的人...
摘要:但是頻繁的關閉服務與重啟服務,這樣就造成了很多時間浪費,所以我們需要利用來監視文件的改動,并將這些改動重新發布到生產目錄,并重啟服務非手動。三預處理器文件編譯暫時沒用到,后面用到再增加,可以參考其他人的 關于gulp,grunt,webpack,剛走前端模塊化的我,真的是傻傻分不清楚,幸好有大神各種答疑解惑,使我略知一二,你也想知道的,也許還想知道點啥,資源羅列:1、中文官方文檔;2、...
摘要:目前正在開發一個系統,對于前端模塊化與打包這塊出現了一些選擇。采用模塊化及打包由于項目比較小,稍微了解后,覺得沒必要采用。組件化,目前比較流行的如等。項目較小需要交互更新頁面的并不多,沒有采用。 目前正在開發一個python markdown wiki系統,對于前端模塊化與打包這塊出現了一些選擇。1、采用webpack模塊化及打包由于項目比較小,稍微了解后,覺得沒必要采用webpack...
摘要:目前正在開發一個系統,對于前端模塊化與打包這塊出現了一些選擇。采用模塊化及打包由于項目比較小,稍微了解后,覺得沒必要采用。組件化,目前比較流行的如等。項目較小需要交互更新頁面的并不多,沒有采用。 目前正在開發一個python markdown wiki系統,對于前端模塊化與打包這塊出現了一些選擇。1、采用webpack模塊化及打包由于項目比較小,稍微了解后,覺得沒必要采用webpack...
摘要:是一個構建工具,基于的平臺運行,使用的是的模塊化語法。我們使用需要用到的包一個任務,對應一個包,對應一個處理邏輯對應的是同步任務,從左到右,依次執行任務。時間長對應的是異步任務,效率高,時間短。 gulp 是一個構建工具,基于Node.js的平臺運行,使用的是commonJs的模塊化語法。 我們使用gulp需要用到的包 一個TASK任務,對應一個包,對應一個處理邏輯、 gulp.s...
閱讀 2458·2021-09-27 13:36
閱讀 2163·2019-08-29 18:47
閱讀 2129·2019-08-29 15:21
閱讀 1394·2019-08-29 11:14
閱讀 1979·2019-08-28 18:29
閱讀 1623·2019-08-28 18:04
閱讀 568·2019-08-26 13:58
閱讀 3206·2019-08-26 12:12