摘要:解析不同文件使用哪些,這個比較簡單,很多文章都有,就不多說了,注意的是,這里的可以換成你自己的預編譯器,例如等,或者直接用都行,當然還可以用一種通用方法,后面補上。
前情提要
上一篇文章介紹了目前前端比較流行的各種編輯器,以及各種流行的打包方式,最后給了一個Gulp的例子,這個例子還是14年的時候寫的,還有一些可以優化的空間,就不討論了,這篇文章主要講目前火熱的打包構建方式--Webpack的使用方式。
主菜--沒有開胃湯其實Webpack的入門指導文章非常多,配置方式也各有各樣,這里我推薦題葉大神的入門級指南--Webpack 入門指迷,如果不知道Webpack是什么或者不是很清楚各項配置含義的開發者,可以看此文章掃掃盲。畢竟我這篇文章并不是特別基礎。
一、base.jsvar path = require("path") var baseConfig = { resolve: { extensions: ["", ".js"], fallback: [path.join(__dirname, "../node_modules")], alias: { "src": path.resolve(__dirname, "../src"), "assets": path.resolve(__dirname, "../src/assets"), "components": path.resolve(__dirname, "../src/components") } }, module: { loaders: [{ test: /.js$/, loader: "babel", exclude: /node_modules/ }, { test: /.(png|jpe?g|gif|svg|woff2?|eot|ttf|otf)(?.*)?$/, loader: "url?limit=8192&context=client&name=[path][name].[hash:7].[ext]" }, { test: /.css$/, loader: "style!css!autoprefixer", }, { test: /.scss$/, loader: "style!css!autoprefixer!sass" }] } }; module.exports = baseConfig;
解讀下這個基本配置:
1、resolve 解析模塊依賴的時候,受影響的配置項。
extensions 決定了哪些文件后綴在引用的時候可以省略點,Webpack幫助你補全名稱。
fallback 當webpack在 root(默認當前文件夾,配置時要絕對路徑) 和 modulesDirectories(默認當前文件夾,相對路徑)配置下面找不到相關modules,去哪個文件夾下找modules
alias 這個大家應該比較熟悉,requirejs之類的都有,就是別名,幫助你快速指向文件路徑,少寫不少代碼,而且不用關心層級關系,需要注意的是:在scss之類的css預編譯中引用要加上~,以便于讓loader識別是別名引用路徑。
2、module 解析不同文件使用哪些loader,這個比較簡單,很多文章都有,就不多說了,注意的是,這里的scss可以換成你自己的預編譯器,例如:sass、less、stylus等,或者直接用postcss都行,當然還可以用一種通用方法,后面補上。
二、開發環境配置--configvar webpack = require("webpack"); var path = require("path") var merge = require("webpack-merge") var baseConfig = require("./webpack.base") var getEntries = require("./getEntries") var hotMiddlewareScript = "webpack-hot-middleware/client?reload=true"; var assetsInsert = require("./assetsInsert") module.exports = merge(baseConfig, { entry: getEntries(hotMiddlewareScript), devtool: "#eval-source-map", output: { filename: "./[name].[hash].js", path: path.resolve("./dist"), publicPath:"./dist" }, plugins: [ new webpack.DefinePlugin({ "process.env": { NODE_ENV: ""development"" } }), new webpack.optimize.OccurenceOrderPlugin(), new webpack.HotModuleReplacementPlugin(), new webpack.NoErrorsPlugin(), new assetsInsert() ] })
說說這個配置中的一些難點:
1、getEntries 是用來配置入口文件,一般很多人是自己手寫,或者SPA頁面,只有一個入口, 很容易就寫出來,但是公司中,很多情況,是需要多入口,也就是多路由的Url,這個時候入口的配置就比較麻煩,我這里是放多帶帶一個文件里面配置,我們公司是靠規定來執行,也就是一個文件夾所有的main.js都認為是入口文件,其他都忽略。
function getEntry(hotMiddlewareScript) { var pattern = paths.dev.js + "project/**/main.js"; var array = glob.sync(pattern); var newObj = {}; array.map(function(el){ var reg = new RegExp("project/(.*)/main.js","g"); reg.test(el); if (hotMiddlewareScript) { newObj[RegExp.$1] = [el, hotMiddlewareScript]; } else { newObj[RegExp.$1] = el; } }); return newObj; }
2、assetsInsert 是用來做模板替換的,一個小插件把template里面的值替換成打包后的css或者js。
三、打包環境配置--productionvar webpack = require("webpack"); var path = require("path") var merge = require("webpack-merge") var baseConfig = require("./webpack.base") var getEntries = require("./getEntries") var ExtractTextPlugin = require("extract-text-webpack-plugin"); var assetsInsert = require("./assetsInsert") var productionConf = merge(baseConfig, { entry: getEntries(), output: { filename: "./[name].[hash].js", path: path.resolve("./public/dist"), publicPath: "./" }, plugins: [ new webpack.DefinePlugin({ "process.env": { NODE_ENV: ""production"" } }), new ExtractTextPlugin("./[name].[hash].css", { allChunks: true }), new webpack.optimize.UglifyJsPlugin({ compress: { warnings: false } }), new webpack.optimize.OccurenceOrderPlugin(), new assetsInsert() ] }) productionConf.module.loaders = [ { test: /.js$/, loader: "babel", exclude: /node_modules/ }, { test: /.(png|jpe?g|gif|svg|woff2?|eot|ttf|otf)(?.*)?$/, loader: "url?limit=8192&context=client&name=[path][name].[hash:7].[ext]" }, { test: /.css$/, loader: ExtractTextPlugin.extract("style", "css"), }, { test: /.scss$/, loader: ExtractTextPlugin.extract("style", "css!sass") }] module.exports = productionConf
基本跟開發的差不多,差別在于:
1、使用ExtractTextPlugin 來打包css,所以要干掉原來base的loaders,重新寫了一個,在最下面。
2、UglifyJsPlugin 給js壓縮代碼。其他沒有什么好解釋的了,一樣的。
四、構建命令require("shelljs/global") env.NODE_ENV = "production" var ora = require("ora") var webpack = require("webpack") var webpackConfig = require("./webpack.production.config") var spinner = ora("building for production...") spinner.start() var staticPath = __dirname + "/../public/dist/" rm("-rf", staticPath) mkdir("-p", staticPath) webpack(webpackConfig, function (err, stats) { spinner.stop() if (err) throw err process.stdout.write(stats.toString({ colors: true, modules: false, children: false, chunks: false, chunkModules: false }) + " ") })
寫一個build.js,然后在package.json里面添加 script 參數
"build": "node build.js"http://這里記得寫自己build.js路徑甜點(馬卡龍)--有點膩
上面的配置是可以更改的,例如你在loaders 里面加上
{ test: /.vue$/, loader: "vue" }
就可以變成支持.vue文件的vuejs打包構建,同理,修改下支持jsx,和添加一些reactjs的module,就可以用來跑Reactjs的東西。
還有可以隨意更改Css預編譯器的類型,用你自己喜歡就行,或者跟我們前面提到的方法,把所有類型都配置上,
var path = require("path") var config = require("../config") var ExtractTextPlugin = require("extract-text-webpack-plugin") exports.assetsPath = function (_path) { return path.posix.join(config.build.assetsSubDirectory, _path) } exports.cssLoaders = function (options) { options = options || {} // generate loader string to be used with extract text plugin function generateLoaders (loaders) { var sourceLoader = loaders.map(function (loader) { var extraParamChar if (/?/.test(loader)) { loader = loader.replace(/?/, "-loader?") extraParamChar = "&" } else { loader = loader + "-loader" extraParamChar = "?" } return loader + (options.sourceMap ? extraParamChar + "sourceMap" : "") }).join("!") if (options.extract) { return ExtractTextPlugin.extract("vue-style-loader", sourceLoader) } else { return ["vue-style-loader", sourceLoader].join("!") } } // http://vuejs.github.io/vue-loader/configurations/extract-css.html return { css: generateLoaders(["css"]), postcss: generateLoaders(["css"]), less: generateLoaders(["css", "less"]), sass: generateLoaders(["css", "sass?indentedSyntax"]), scss: generateLoaders(["css", "sass"]), stylus: generateLoaders(["css", "stylus"]), styl: generateLoaders(["css", "stylus"]) } } // Generate loaders for standalone style files (outside of .vue) exports.styleLoaders = function (options) { var output = [] var loaders = exports.cssLoaders(options) for (var extension in loaders) { var loader = loaders[extension] output.push({ test: new RegExp("." + extension + "$"), loader: loader }) } return output }
這就是把所有的css預編譯的都加到配置里面了。
總結下--買單啦Webpack多種多樣,就算一個loaders都有好幾種不同的配置,讓人很是頭疼,最關鍵的是很多插件自己的文檔也不清不楚,弄得大家都很迷茫,我的經驗就是多試多測,自己多寫一寫,看命令行打印的錯誤,去找原因,不要一看到報錯就慌了,很多新手最容易犯錯就是一看到報錯就懷疑人生了,一定要看報錯記錄,一般都有提示,按照提示去解決相應問題就好啦。
下一章我們講Nodejs的東東。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/90910.html
摘要:的最后一個大招就是替換一些傳統的服務端語言,例如,,等,在業務層上面使用來開發服務端完全不成問題。更多的的使用細節和技巧建議關注美團博客大搜車論壇下一篇我們開啟如何結合和搭建一個開發環境和項目目錄 往期回顧 前面2期都講得是瀏覽器端的東西比較多,包括Webpack,雖然是Node處理的,但是還是瀏覽器端用的多,對于現在的前端開發來說,不懂一點服務端的東西,簡直沒辦法活,一般的招聘要求都...
摘要:解析不同文件使用哪些,這個比較簡單,很多文章都有,就不多說了,注意的是,這里的可以換成你自己的預編譯器,例如等,或者直接用都行,當然還可以用一種通用方法,后面補上。 前情提要 上一篇文章介紹了目前前端比較流行的各種編輯器,以及各種流行的打包方式,最后給了一個Gulp的例子,這個例子還是14年的時候寫的,還有一些可以優化的空間,就不討論了,這篇文章主要講目前火熱的打包構建方式--Webp...
摘要:我覺得這方面的原因是當時對和的依賴,導致大家對的興趣不弄,錯過了最佳時機,這個其實跟百度自己的的技術棧有很大關系。這個阮一峰對于前端構建的變化吐槽過,說新的構建工具就是的構建工具。 文章來源 最近幾年,前端發展越來越迅速,各種萌新加入了前端這個大家庭,大有趕IOS、超Android的趨勢呀!同時,萌新們提出了各種前端工作問題,除了最基礎的html、css、js三板斧之外,最讓人頭疼的應...
摘要:我覺得這方面的原因是當時對和的依賴,導致大家對的興趣不弄,錯過了最佳時機,這個其實跟百度自己的的技術棧有很大關系。這個阮一峰對于前端構建的變化吐槽過,說新的構建工具就是的構建工具。 文章來源 最近幾年,前端發展越來越迅速,各種萌新加入了前端這個大家庭,大有趕IOS、超Android的趨勢呀!同時,萌新們提出了各種前端工作問題,除了最基礎的html、css、js三板斧之外,最讓人頭疼的應...
閱讀 1702·2021-11-25 09:43
閱讀 2665·2019-08-30 15:53
閱讀 1808·2019-08-30 15:52
閱讀 2897·2019-08-29 13:56
閱讀 3317·2019-08-26 12:12
閱讀 565·2019-08-23 17:58
閱讀 2126·2019-08-23 16:59
閱讀 931·2019-08-23 16:21