国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

如何使用webpack架構(gòu)項(xiàng)目——新手教程

sutaking / 3575人閱讀

摘要:博主最近在學(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 (? ??_??)? 支持一下博主

項(xiàng)目結(jié)構(gòu)

整個(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


打包后:




    
    Document


    404



為什么博主要這么強(qiáng)調(diào)這個(gè),因?yàn)楹芏啾容^傳統(tǒng)的前端開發(fā)都是不會在開發(fā)過程中對模板進(jìn)行處理,只會在部署的時(shí)候?qū)δ0暹M(jìn)行靜態(tài)資源鏈接處理和其他一些處理,這也是我在一開始研究webpack的時(shí)候的一個(gè)誤區(qū)琢磨了好久關(guān)于webpack的打包部署,實(shí)際上webpack就是希望所有的文件都是經(jīng)由其動態(tài)處理生成的。所以開發(fā)環(huán)境中會有一個(gè)template目錄用于我們開發(fā)還有一個(gè)views用來存儲處理后的的模板文件。所有的這樣子開發(fā),啟動開發(fā)環(huán)境
template中error.ejs:




    
    Document


    404

生成views中的error.ejs




    
    Document


    404

后端模板文件夾指定為views就好了,這樣就能愉快的開發(fā)了,也不會影響到后續(xù)的打包部署。
之后是js的處理

plugins.push(new optimize.CommonsChunkPlugin("common","js/common.js"));

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")
  }
}

CommonsChunkPlugin指定生成公用js文件,第一個(gè)是模塊的命名,第二個(gè)是指定存儲路徑,一定要記得指定模塊名,不然HtmlWebpackPlugin 的chunks: ["common",index]是不會把common打包進(jìn)去的,因?yàn)椴恢付▽τ谒鼇碚f就是沒有這個(gè)模塊。其他的話就是最基礎(chǔ)的webpack的配置,不懂得請?jiān)敿?xì)閱讀網(wǎng)上相關(guān)的webpack基礎(chǔ)入門文章。

部署模式(生產(chǎn)環(huán)境)

生產(chǎn)環(huán)境中的config文件webpack.deploy.js:

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",
    cdnPath=configFile.CDN||"",
    publicPath=cdnPath+staticPath,outputPath=configFile.OUTPUT||"/output";
//額外插件
//用以生產(chǎn)多帶帶的css文件
var ExtractTextPlugin = require("extract-text-webpack-plugin"),
    extractLESS = new ExtractTextPlugin("css/[name]_[hash].css"),
    HtmlWebpackPlugin = require("html-webpack-plugin"),
    viewList=util.getView(configFile.VIEWENTER),htmlList=[];

//清空打包生產(chǎn)后的文件
util.rmdirSync(path.join(__dirname, outputPath));

for(var index in viewList){
  plugins.push(new HtmlWebpackPlugin({
      title: "My App",
      filename: "../views/"+index+".ejs",
      template: viewList[index],
      chunks: ["common",index]
  }));
}

plugins.push(new optimize.CommonsChunkPlugin("common","js/common_[hash].js"));
plugins.push(extractLESS);

module.exports = {
  entry: util.getEntry(configFile.JSENTER),
  output: {
    path: path.join(__dirname, outputPath+"/static"),
    filename: "js/[name]_[hash].js",
    publicPath:publicPath
  },
  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/[hash].[ext]"
    }, {
        test: /.html$/,
        loader: "html"
    }]
  },
  resolve: {
    root: path.resolve("./src")
  }
}

實(shí)際上因?yàn)殚_發(fā)環(huán)境中就已經(jīng)對模板中的靜態(tài)資源進(jìn)行處理了,所以部署環(huán)境配置就很簡單了
獲取config中cdn路徑配置把他整合到publicPath中

var  cdnPath=configFile.CDN||"",
    publicPath=cdnPath+staticPath,outputPath=configFile.OUTPUT||"/output";

為資源打上hash值

//這里指定css文件的hash值
var ExtractTextPlugin = require("extract-text-webpack-plugin"),
    extractLESS = new ExtractTextPlugin("css/[name]_[hash].css"),
//這里指定公用文件的hash值
plugins.push(new optimize.CommonsChunkPlugin("common","js/common_[hash].js"));
module.exports = {
  entry: util.getEntry(configFile.JSENTER),
  output: {
    path: path.join(__dirname, outputPath+"/static"),
    //這里指定js的文件hash值
    filename: "js/[name]_[hash].js",
    publicPath:publicPath
  },
  plugins:plugins,
  module: {
    loaders: [{
      test: /.less$/,
      loader:  extractLESS.extract(["css","less"])
    },{
      test: /.js$/,
      loader:"babel?sourceMap"
    },{ 
      test: /.(png|jpg)$/, 
      //這里指定圖片路徑的hash值
      loader: "url-loader?limit=8192&name=/image/[hash].[ext]"
    }, {
        test: /.html$/,
        loader: "html"
    }]
  },
  resolve: {
    root: path.resolve("./src")
  }
}

這樣基本上就好了,當(dāng)然還有涉及到cdn資源上傳的一些問題,這里沒有,可以使用gulp-sftp,也有sftp-webpack-plugin試試。

開發(fā)過程

首先配置好package.json的命令行

"scripts": {
    "start": "node app",
    "dev": "webpack --watch",
    "deploy": "webpack --config webpack.deploy.js -p"
  }

"dev": "webpack --watch"配置Dev啟動監(jiān)聽文件變化運(yùn)行webpack,--watch目前新版本應(yīng)該沒有內(nèi)存泄漏問題了
"deploy": "webpack --config webpack.deploy.js -p"配置deploy -p傳參表示對js,css內(nèi)容進(jìn)行壓縮混淆
"start": "node app" 配置express啟動
然后用webstorm打開項(xiàng)目目錄點(diǎn)擊npm的dev,當(dāng)然你也可以選擇其他編輯器,只要開發(fā)的時(shí)候命令行運(yùn)行npm run dev命令就好了

最后你就可以愉快的開始新的搬磚之旅了。

ps:博主用ExtractTextPlugin發(fā)現(xiàn) extractLESS.extract(["css","less"])如果調(diào)換成extractLESS.extract(["less","css"])的話啟動就會報(bào)錯(cuò)估計(jì)是less跟css-loader不兼容,結(jié)果到現(xiàn)在都用不了唯一css名,不知道有沒有誰解決過這個(gè)問題,有的話請留言告知,雖然博主實(shí)際工程中并不用less,但是還是很想知道原因。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/80201.html

相關(guān)文章

  • 2017年1月前端月報(bào)

    摘要:平日學(xué)習(xí)接觸過的網(wǎng)站積累,以每月的形式發(fā)布。年以前看這個(gè)網(wǎng)址概況在線地址前端開發(fā)群月報(bào)提交原則技術(shù)文章新的為主。 平日學(xué)習(xí)接觸過的網(wǎng)站積累,以每月的形式發(fā)布。2017年以前看這個(gè)網(wǎng)址:http://www.kancloud.cn/jsfron... 概況 在線地址:http://www.kancloud.cn/jsfront/month/82796 JS前端開發(fā)群月報(bào) 提交原則: 技...

    FuisonDesign 評論0 收藏0
  • 2017年1月前端月報(bào)

    摘要:平日學(xué)習(xí)接觸過的網(wǎng)站積累,以每月的形式發(fā)布。年以前看這個(gè)網(wǎng)址概況在線地址前端開發(fā)群月報(bào)提交原則技術(shù)文章新的為主。 平日學(xué)習(xí)接觸過的網(wǎng)站積累,以每月的形式發(fā)布。2017年以前看這個(gè)網(wǎng)址:http://www.kancloud.cn/jsfron... 概況 在線地址:http://www.kancloud.cn/jsfront/month/82796 JS前端開發(fā)群月報(bào) 提交原則: 技...

    ivyzhang 評論0 收藏0
  • 2017年1月前端月報(bào)

    摘要:平日學(xué)習(xí)接觸過的網(wǎng)站積累,以每月的形式發(fā)布。年以前看這個(gè)網(wǎng)址概況在線地址前端開發(fā)群月報(bào)提交原則技術(shù)文章新的為主。 平日學(xué)習(xí)接觸過的網(wǎng)站積累,以每月的形式發(fā)布。2017年以前看這個(gè)網(wǎng)址:http://www.kancloud.cn/jsfron... 概況 在線地址:http://www.kancloud.cn/jsfront/month/82796 JS前端開發(fā)群月報(bào) 提交原則: 技...

    CloudwiseAPM 評論0 收藏0
  • 1月份前端資源分享

    摘要:更多資源請文章轉(zhuǎn)自月份前端資源分享視頻前端技術(shù)論壇融合不可錯(cuò)過的迷你庫測試框架實(shí)例教程為你詳細(xì)解讀請求頭的具體含意解析的庫如果要用前端框架,開發(fā)流程是怎樣的與有什么區(qū)別正確使用的方法是什么流程圖插件小如何讓元素只能輸入純文本前端技術(shù)中 更多資源請Star:https://github.com/maidishike... 文章轉(zhuǎn)自:https://github.com/jsfront...

    solocoder 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<