摘要:博主最近在學(xué)習(xí),順便搭建了一個(gè)基于的前端項(xiàng)目架構(gòu)在此寫文記錄一下,同時(shí)教會新入坑的小伙伴們?nèi)绾卧陧?xiàng)目中玩弄,額玩轉(zhuǎn)。所以開發(fā)環(huán)境中會有一個(gè)目錄用于我們開發(fā)還有一個(gè)用來存儲處理后的的模板文件。
博主最近在學(xué)習(xí)react redux,順便搭建了一個(gè)基于webpack的前端項(xiàng)目架構(gòu),在此寫文記錄一下,同時(shí)教會新入webpack坑的小伙伴們?nèi)绾卧陧?xiàng)目中玩弄,額!玩轉(zhuǎn)webpack。
github demo傳送門:redux-demo 如果覺得寫的還可以的話記得star (? ??_??)? 支持一下博主
整個(gè)項(xiàng)目的目錄的話是跟普通react redux項(xiàng)目相同的目錄結(jié)構(gòu),目錄結(jié)構(gòu)如下:
-redux-demo -bin -routes -src -js -action -components -constants -page -reducers -less -template -views(項(xiàng)目開發(fā)視圖生成目錄) -build(項(xiàng)目開發(fā)打包目錄) -output(項(xiàng)目生產(chǎn)環(huán)境打包目錄) -app.js -config.js -util.js -webpack.config.js -webpack.deploy.js
以上項(xiàng)目目錄中build文件夾為開發(fā)環(huán)境中的靜態(tài)資源的生成目錄,views為開發(fā)環(huán)境下模板生成目錄,output則是生產(chǎn)環(huán)境中打包出來的靜態(tài)資源及模板目錄,webpack.config.js與webpack.deploy.js分別為webpack的開發(fā)config文件及發(fā)布config文件,util.js包含了一些關(guān)于file操作的公用方法,config.js則包含了包括cdn地址,文件入口與打包路徑等信息
開發(fā)環(huán)境下webpack config開發(fā)模式的config主要內(nèi)容如下:
var path = require("path"), fs=require("fs"), configFile=require("./config.js"), util=require("./util.js"), webpack = require("webpack"), optimize = webpack.optimize, plugins=[],staticPath=configFile.STATICPATH||"/static"; //額外插件 //用以生產(chǎn)多帶帶的css文件 var ExtractTextPlugin = require("extract-text-webpack-plugin"); var extractLESS = new ExtractTextPlugin("css/[name].css"), HtmlWebpackPlugin = require("html-webpack-plugin"), viewList=util.getView(configFile.VIEWENTER),htmlList=[]; plugins.push(new optimize.CommonsChunkPlugin("common","js/common.js")); plugins.push(extractLESS); for(var index in viewList){ plugins.push(new HtmlWebpackPlugin({ title: "My App", filename: "../views/"+index+".ejs", template: viewList[index], chunks: ["common",index] })); } module.exports = { entry: util.getEntry(configFile.JSENTER), output: { path: path.join(__dirname, "/build"), filename: "js/[name].js", publicPath:staticPath }, plugins:plugins, module: { loaders: [{ test: /.less$/, loader: extractLESS.extract(["css","less"]) },{ test: /.js$/, loader:"babel?sourceMap" },{ test: /.(png|jpg)$/, loader: "url-loader?limit=8192&name=/image/[name].[ext]" }] }, resolve: { root: path.resolve("./src") } }
我們逐句分析一下這個(gè)config文件的內(nèi)容及所做的事情
css的處理
var ExtractTextPlugin = require("extract-text-webpack-plugin"); var extractLESS = new ExtractTextPlugin("css/[name].css"), loader: extractLESS.extract(["css","less"])
對于css我不希望嵌入到html中所以引入了extract-text-webpack-plugin中間件它可以將插件中引入的css生成一個(gè)獨(dú)立位置ExtractTextPlugin傳參位置相對于webpack output中的path。這里對于路徑其實(shí)要注意一下的,因?yàn)閣ebpack開發(fā)的話模板是HtmlWebpackPlugin動態(tài)生成js css等靜態(tài)資源引用的,無論開發(fā)還是部署環(huán)境請都配置上publicPath,同時(shí)配置打包路徑不要使用../css/[name.css]這種相對路徑,如果不配置上而且用這樣鏈接,你會發(fā)現(xiàn)你的模板里的引用會變成這樣自/build/../css/[name.css],額!感覺還是相當(dāng)?shù)目樱ú恢朗遣皇遣┲鞯氖褂梅绞接袉栴},知道的可以留言指正一下)。
模板處理
var HtmlWebpackPlugin = require("html-webpack-plugin"), plugins=[], //獲取模板文件夾下所有的模板的文件路徑 viewList=util.getView(configFile.VIEWENTER); //循環(huán)遍歷模板路徑對象,生成HtmlWebpackPlugin實(shí)例 for(var index in viewList){ plugins.push(new HtmlWebpackPlugin({ title: "My App", filename: "../views/"+index+".ejs", template: viewList[index], chunks: ["common",index] })); }
這一段代碼就是通過HtmlWebpackPlugin來進(jìn)行模板處理的,實(shí)際上很簡單獲取需要打包的的文件夾下的所有模板文件然后循環(huán)遍歷生成HtmlWebpackPlugin的實(shí)例放入到plugins的列表當(dāng)中,其中引入的模塊限于公用模塊及模板同名的模塊,而HtmlWebpackPlugin所做的也相當(dāng)簡單只是單純的將js文件插入到尾部,將css引用插入到頭部,也可以自己指定位置,具體方法可以參考HtmlWebpackPlugin的文檔,不過目前看來這樣簡單的配置也能夠滿足基本開發(fā)了。
在博主研究webpack的過程中發(fā)現(xiàn)很多的文章中并不會在開發(fā)環(huán)境下加入HtmlWebpackPlugin,但實(shí)際上HtmlWebpackPlugin的打包并不會去解析現(xiàn)有的js和css的link引用只會簡單的追加引用,比如下面的模板:
Document 404