Webpack配合Express項目開發(fā)

本文基于工作項目開發(fā),做的整理筆記
在某個節(jié)點萝风,想嘗試一下node藐翎,擺脫jsp的java前端方式材蹬,就切換到了Express框架,后臺依然是java提供API吝镣,但是前端再也不用寫java的controller堤器、jsp頁面了。Good赤惊。之前用gulp做sass、js的打包壓縮凰锡,現(xiàn)在也想整理下項目的結(jié)構(gòu)未舟,用上慢慢熟悉的Webpack圈暗。本文就是做個筆記,兩者如何配合使用裕膀。

前提條件:
你已經(jīng)了解基本的Webpack知識和nodejs的Express员串。
關(guān)于Webpack,可閱讀:Webpack初學(xué)者使用教程昼扛。
關(guān)于Express寸齐,晚些時候才會寫一篇,你可以先去谷歌一下(本文對Express只是一帶而過)抄谐。

編碼環(huán)境:
系統(tǒng):OS X EI Capitan
版本:10.11.6

webpackAndExpress.png

我用Webpack做什么

在這里渺鹦,我的需求很簡單。我只是想要webpack幫我做2件事:

  • 合并蛹含、打包毅厚、壓縮成多個js
  • 將sass轉(zhuǎn)換成css,并打包成一個單獨的css文件

如果你的需求和我不太一樣浦箱,這篇文章可能不太適合你吸耿。不過歡迎你閱讀并給予指導(dǎo),謝謝酷窥。

先看一下項目結(jié)構(gòu)

我們先看一下原來的項目結(jié)構(gòu)(不帶webpack)咽安,然后再看一下webpack將用在哪里。

myProject
| - app
??| - controllers
??| - models (如果不連接數(shù)據(jù)庫蓬推,純粹調(diào)用API接口妆棒,這個就沒有)
??| - schemas (如果不連接數(shù)據(jù)庫,純粹調(diào)用API接口拳氢,這個就沒有)
??| - views
| - bin
??| - www
| - config
??| - config.js
| - node_modules (項目所需模塊)
| - routes
??| - routes.js
| - static
??| - build
??| - fonts
??| - images
??| - js
??| - sass
| - test
| - app.js
| - package.json

我的大概就這么多募逞,省略掉了部署時pm2的配置文件process.json,還有一些log文件馋评。如果你還有用bower管理jquery放接,bootstrap等可能會有.bowerrc,bower.json留特。如果你還用了git可能會看到.gitignore文件纠脾。如果你還有用...

這篇文章的目的就是重做static(靜態(tài)文件)這一塊內(nèi)容,將webpack整合進來蜕青,讓它為我們的項目服務(wù)苟蹈。所以static文件夾的結(jié)構(gòu)將會變成下面這個樣子。(其他文件都沒有改變右核,包括app.js)

| - static
??| - build (打包出來的js慧脱、css放這里)
??| - fonts
??| - images
??| - node-modules (項目所需模塊)
??| - js
??| - sass
??| - package.json
??| - webpack.config.dev.js
??| - webpack.config.prod.js

開發(fā)時如何使用呢

我前面說了,我不去改變原有的express項目結(jié)構(gòu)贺喝。只是重新構(gòu)建static文件夾菱鸥,改變它的內(nèi)容宗兼,webpack僅僅在這里面起作用,完全不會影響到外面氮采。在開發(fā)的時候殷绍,你可以選擇兩種使用方式:

  • 每次js或sass文件改動,就執(zhí)行打包鹊漠,重新生成一次主到。
    只需要穩(wěn)定跑起express應(yīng)用服務(wù),然后不斷的對靜態(tài)文件打包躯概、打包登钥、打包...

  • 跑起一個express應(yīng)用服務(wù),再跑起一個webpack的server楞陷。
    開發(fā)時怔鳖,修改頁面的引用,比如說

<link rel="stylesheet" href="http://localhost:8080/styles.css">
<script type='text/javascript' src='http://localhost:8080/main.js'></script>
(其中固蛾,localhost:8080是webpack dev server)

若使用后者的方式结执,就需要在部署時,修改相關(guān)引用文件的路徑艾凯。
這里献幔,可以做一個變量,根據(jù)NODE_ENV是不是為dev趾诗,自動去做不一樣的路徑引用蜡感。

你可能會說這什么方法,好像不是很好恃泪。有沒有更好的方法呢郑兴?
很抱歉的說,目前贝乎,我只是用這個方法情连。我在谷歌上搜了一些其他方法,有些我弄到最后都沒有成功览效,也許是我哪里配置錯了却舀;有些是覺得操作起來好繁瑣,代碼有需要混在node那邊锤灿,幾個引用幾個配置挽拔。如果nodejs的express本身不是非常熟悉的話,感覺一團亂但校。(到時候想丟掉webpack螃诅,又有點懵逼)

選擇這樣一個方式,還是有些好處的,比如說:

  • express那邊是express术裸,靜態(tài)資源webpack這邊就是webpack兩邊不影響空执。我想丟掉webpack,去用gulp穗椅、去用grunt,輕輕松松奶栖∑ケ恚或者我就是丟掉,什么都不用了宣鄙。
  • 也是因為上面這個原因袍镀,代碼更清晰。別人上手或者接手項目進行開發(fā)冻晤,也非常容易苇羡。

相關(guān)命令跑起webpack

這篇文章并不是去關(guān)注express如何用的,你可以谷歌搜索閱讀相關(guān)文章鼻弧。Express這個我還沒有整理出來设江,我也是個菜鳥??????,晚些我再學(xué)習(xí)學(xué)習(xí)攘轩,整理一篇叉存。
關(guān)于webpack的配置,你可以閱讀我之前的一篇筆記:Webpack初學(xué)者使用教程度帮,這里不會詳細(xì)的介紹了歼捏。
這里對跑起webpack的命令重復(fù)一遍。首先你要進入到static文件夾笨篷,為它生成一個package.json:

$ npm init

然后我們安裝一遍需要的模塊瞳秽,命令如下:

$ npm install -g webpack webpack-dev-server (如果你全局沒有安裝的話,跑一下)
$ npm install --save-dev webpack style-loader css-loader sass-loader node-sass 
$ npm install --save-dev extract-text-webpack-plugin webpack-dev-server

然后我們?nèi)?chuàng)建webpack.config.dev.js率翅,webpack.config.prod.js练俐,并修改相應(yīng)內(nèi)容,如下:

$ touch webpack.config.dev.js webpack.config.prod.js

下面是webpack.config.dev.js的內(nèi)容:

// webpack.config.dev.js
var path = require('path')
var webpack = require('webpack')
var ExtractTextPlugin = require('extract-text-webpack-plugin')
module.exports = {
  devtool: 'cheap-eval-source-map',
  entry: [
    'webpack-dev-server/client?http://localhost:8080',
    'webpack/hot/dev-server',
    './js/index'
  ],
  output: {
    path: path.join(__dirname, 'build'),
    filename: 'bundle.js'
  },
  plugins: [
    new webpack.HotModuleReplacementPlugin(),
    new ExtractTextPlugin("styles.css")
  ],
  module: {
    loaders: [
      {
       test: /\.scss$/,
       loader: ExtractTextPlugin.extract('style', 'css!sass')
      }
      // 看到這個注釋了么安聘,額外提一點
      // 如果你在 sass那里用了susy痰洒,你就必須用上面的寫法;如果沒有用浴韭,可以使用下面這種寫法
      // {
      //  test: /\.scss$/,
      //  loader: ExtractTextPlugin.extract('style-loader', 'css-loader', 'sass-loader')
      // }, 
    ]
  },
  devServer: {
    contentBase: './build',
    hot: true
  }
}

下面是webpack.config.prod.js的內(nèi)容:

// webpack.config.prod.js
var path = require('path')
var webpack = require('webpack')
var ExtractTextPlugin = require('extract-text-webpack-plugin');
module.exports = {
  devtool: 'source-map',
  entry: ['./js/index'],
  output: {
    path: path.join(__dirname, 'build'),
    filename: 'bundle.js'
  },
  plugins: [
    new webpack.optimize.UglifyJsPlugin({
      minimize: false, 
      compressor: {
        warnings: false,
      },
    }),
    new webpack.optimize.OccurrenceOrderPlugin(),
    new ExtractTextPlugin("styles.css"),
    new webpack.DefinePlugin({
      'process.env.NODE_ENV': JSON.stringify('production')
    })
  ],
  module: {
    loaders: [
      {
       test: /\.scss$/,
       loader: ExtractTextPlugin.extract('style', 'css!sass')
      } 
    ]
  }
}

然后我們?nèi)ackage.json中加兩個script丘喻,簡化一下跑起server和打包文件的命令。如下:

  ... 
  "scripts": { 
      "build": "webpack --config webpack.config.prod.js", 
      "dev": "webpack-dev-server --config webpack.config.dev.js"
  }, 
  ...

之后念颈,只要通過下面的命令就可以執(zhí)行:

$ npm run dev (跑dev server)
$ npm run build (跑build production泉粉,進行打包)

好了,開發(fā)的時候,可以盡情的玩耍了嗡靡。

是否還有疑問

會不會對webpack在這里的這種使用方式跺撼,還有疑問?“什么讨彼!webpack就用在static這里歉井,而且僅僅是在這里而已。有沒有一個更好的解決方案哈误,一句命令跑起nodejs的同時哩至,順便可以帶起來webpack,跑起一個webpack-dev-server蜜自。也就是說菩貌,簡單的在app.js里引用webpack-dev-middleware,webpack-hot-middleware重荠,加幾句代碼去搞定它箭阶。
這里,我也希望有更好的方式戈鲁。暫時仇参,我就是用上面那個方式開發(fā)。
我之前也閱讀了相關(guān)文章婆殿,比如在express服務(wù)中搭建webpack-dev-server冈敛,Using react-hot-loader with a webpack-dev-server and a node server

題外話鸣皂,這個項目的sass里抓谴,我還想使用susy去做柵格化布局,代替bootstrap的這一部分寞缝。webpack安裝使用susy也非常方便癌压,研究好了也會做一個筆記。

到這里荆陆,就先結(jié)束了滩届。


學(xué)習(xí)是一條漫漫長路,每天不求一大步被啼,進步一點點就是好的帜消。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市浓体,隨后出現(xiàn)的幾起案子泡挺,更是在濱河造成了極大的恐慌,老刑警劉巖命浴,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娄猫,死亡現(xiàn)場離奇詭異贱除,居然都是意外死亡,警方通過查閱死者的電腦和手機媳溺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門月幌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人悬蔽,你說我怎么就攤上這事扯躺。” “怎么了蝎困?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵缅帘,是天一觀的道長。 經(jīng)常有香客問我难衰,道長,這世上最難降的妖魔是什么逗栽? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任盖袭,我火速辦了婚禮,結(jié)果婚禮上彼宠,老公的妹妹穿的比我還像新娘鳄虱。我一直安慰自己,他們只是感情好凭峡,可當(dāng)我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布拙已。 她就那樣靜靜地躺著,像睡著了一般摧冀。 火紅的嫁衣襯著肌膚如雪倍踪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天索昂,我揣著相機與錄音建车,去河邊找鬼。 笑死椒惨,一個胖子當(dāng)著我的面吹牛缤至,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播康谆,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼领斥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了沃暗?” 一聲冷哼從身側(cè)響起月洛,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎孽锥,沒想到半個月后膊存,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年隔崎,在試婚紗的時候發(fā)現(xiàn)自己被綠了今艺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡爵卒,死狀恐怖虚缎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情钓株,我是刑警寧澤实牡,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站轴合,受9級特大地震影響创坞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜受葛,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一题涨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧总滩,春花似錦纲堵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至冈涧,卻和暖如春茂附,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背督弓。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工何之, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人咽筋。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓溶推,卻偏偏與公主長得像,于是被迫代替她去往敵國和親奸攻。 傳聞我的和親對象是個殘疾皇子蒜危,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,974評論 2 355

推薦閱讀更多精彩內(nèi)容