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

資訊專欄INFORMATION COLUMN

如何使用webpack架構項目——新手教程

sutaking / 3576人閱讀

摘要:博主最近在學習,順便搭建了一個基于的前端項目架構在此寫文記錄一下,同時教會新入坑的小伙伴們如何在項目中玩弄,額玩轉。所以開發(fā)環(huán)境中會有一個目錄用于我們開發(fā)還有一個用來存儲處理后的的模板文件。

博主最近在學習react redux,順便搭建了一個基于webpack的前端項目架構,在此寫文記錄一下,同時教會新入webpack坑的小伙伴們如何在項目中玩弄,額!玩轉webpack。
github demo傳送門:redux-demo 如果覺得寫的還可以的話記得star (? ??_??)? 支持一下博主

項目結構

整個項目的目錄的話是跟普通react redux項目相同的目錄結構,目錄結構如下:

-redux-demo
    -bin
    -routes
    -src
        -js
           -action
           -components
           -constants
           -page
           -reducers
        -less
    -template
    -views(項目開發(fā)視圖生成目錄)
    -build(項目開發(fā)打包目錄)
    -output(項目生產環(huán)境打包目錄)
    -app.js
    -config.js
    -util.js
    -webpack.config.js
    -webpack.deploy.js

以上項目目錄中build文件夾為開發(fā)環(huán)境中的靜態(tài)資源的生成目錄,views為開發(fā)環(huán)境下模板生成目錄,output則是生產環(huán)境中打包出來的靜態(tài)資源及模板目錄,webpack.config.js與webpack.deploy.js分別為webpack的開發(fā)config文件及發(fā)布config文件,util.js包含了一些關于file操作的公用方法,config.js則包含了包括cdn地址,文件入口與打包路徑等信息

開發(fā)環(huán)境下webpack config

開發(fā)模式的config主要內容如下:

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";

//額外插件
//用以生產多帶帶的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")
  }
}

我們逐句分析一下這個config文件的內容及所做的事情
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生成一個獨立位置ExtractTextPlugin傳參位置相對于webpack output中的path。這里對于路徑其實要注意一下的,因為webpack開發(fā)的話模板是HtmlWebpackPlugin動態(tài)生成js css等靜態(tài)資源引用的,無論開發(fā)還是部署環(huán)境請都配置上publicPath,同時配置打包路徑不要使用../css/[name.css]這種相對路徑,如果不配置上而且用這樣鏈接,你會發(fā)現你的模板里的引用會變成這樣自/build/../css/[name.css],額!感覺還是相當的坑(不知道是不是博主的使用方式有問題,知道的可以留言指正一下)。
模板處理

  var HtmlWebpackPlugin = require("html-webpack-plugin"), 
      plugins=[],
      //獲取模板文件夾下所有的模板的文件路徑
      viewList=util.getView(configFile.VIEWENTER);
      //循環(huán)遍歷模板路徑對象,生成HtmlWebpackPlugin實例
      for(var index in viewList){
          plugins.push(new HtmlWebpackPlugin({
              title: "My App",
              filename: "../views/"+index+".ejs",
              template: viewList[index],
              chunks: ["common",index]
          }));
        }
    

這一段代碼就是通過HtmlWebpackPlugin來進行模板處理的,實際上很簡單獲取需要打包的的文件夾下的所有模板文件然后循環(huán)遍歷生成HtmlWebpackPlugin的實例放入到plugins的列表當中,其中引入的模塊限于公用模塊及模板同名的模塊,而HtmlWebpackPlugin所做的也相當簡單只是單純的將js文件插入到尾部,將css引用插入到頭部,也可以自己指定位置,具體方法可以參考HtmlWebpackPlugin的文檔,不過目前看來這樣簡單的配置也能夠滿足基本開發(fā)了。
在博主研究webpack的過程中發(fā)現很多的文章中并不會在開發(fā)環(huán)境下加入HtmlWebpackPlugin,但實際上HtmlWebpackPlugin的打包并不會去解析現有的js和css的link引用只會簡單的追加引用,比如下面的模板:




    
    Document


    404


打包后:




    
    Document


    404



為什么博主要這么強調這個,因為很多比較傳統的前端開發(fā)都是不會在開發(fā)過程中對模板進行處理,只會在部署的時候對模板進行靜態(tài)資源鏈接處理和其他一些處理,這也是我在一開始研究webpack的時候的一個誤區(qū)琢磨了好久關于webpack的打包部署,實際上webpack就是希望所有的文件都是經由其動態(tài)處理生成的。所以開發(fā)環(huán)境中會有一個template目錄用于我們開發(fā)還有一個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文件,第一個是模塊的命名,第二個是指定存儲路徑,一定要記得指定模塊名,不然HtmlWebpackPlugin 的chunks: ["common",index]是不會把common打包進去的,因為不指定對于它來說就是沒有這個模塊。其他的話就是最基礎的webpack的配置,不懂得請詳細閱讀網上相關的webpack基礎入門文章。

部署模式(生產環(huá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";
//額外插件
//用以生產多帶帶的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=[];

//清空打包生產后的文件
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")
  }
}

實際上因為開發(fā)環(huán)境中就已經對模板中的靜態(tài)資源進行處理了,所以部署環(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")
  }
}

這樣基本上就好了,當然還有涉及到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)聽文件變化運行webpack,--watch目前新版本應該沒有內存泄漏問題了
"deploy": "webpack --config webpack.deploy.js -p"配置deploy -p傳參表示對js,css內容進行壓縮混淆
"start": "node app" 配置express啟動
然后用webstorm打開項目目錄點擊npm的dev,當然你也可以選擇其他編輯器,只要開發(fā)的時候命令行運行npm run dev命令就好了

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

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

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

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/80201.html

相關文章

  • 2017年1月前端月報

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

    FuisonDesign 評論0 收藏0
  • 2017年1月前端月報

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

    ivyzhang 評論0 收藏0
  • 2017年1月前端月報

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

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

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

    solocoder 評論0 收藏0

發(fā)表評論

0條評論

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