詳解基于Vue2.0項目的webpack配置文件

Vue提供了一個很好的命令行工具:vue-cli,用來快速構(gòu)建Vue項目。
現(xiàn)在,我們改造一個由vue-cli創(chuàng)建的simple project蠢挡,使其提供更強大的功能。

1. 創(chuàng)建一個簡單的Vue項目

vue init webpack-simple my-webpack-simple-demo

2. package.json

{
  ...
  "scripts": {
    "dev": "cross-env NODE_ENV=development webpack-dev-server --open --hot --env=integrate",
    "build-test": "cross-env NODE_ENV=production webpack --progress --hide-modules --env=test",
    "build-release": "cross-env NODE_ENV=production webpack --progress --hide-modules --env=release"
  },
  "dependencies": {
    "vue": "^2.2.1"
  },
  "devDependencies": {
    "babel-core": "^6.0.0",
    "babel-loader": "^6.0.0",
    "babel-preset-latest": "^6.0.0",
    "clean-webpack-plugin": "^0.1.15",
    "cross-env": "^3.0.0",
    "css-loader": "^0.25.0",
    "element-ui": "^1.2.3",
    "extract-text-webpack-plugin": "^2.0.0-beta.4",
    "file-loader": "^0.9.0",
    "html-webpack-plugin": "^2.28.0",
    "node-sass": "^4.5.0",
    "sass-loader": "^5.0.1",
    "style-loader": "^0.13.2",
    "url-loader": "^0.5.8",
    "vue-cookie": "^1.1.3",
    "vue-loader": "^11.0.0",
    "vue-resource": "^1.2.1",
    "vue-router": "^2.3.0",
    "vue-style-loader": "^2.0.3",
    "vue-template-compiler": "^2.2.1",
    "vuex": "^2.2.1",
    "webpack": "^2.2.0",
    "webpack-dev-server": "^2.2.0"
  }
}

3. 文件結(jié)構(gòu)

webpack.png

4. .babelrc

Babel是ES6轉(zhuǎn)碼器,可以將項目中用到的ES6語法編譯為ES5語法业踏。

我們需要安裝babel-loader babel-core禽炬,然后新增.babelrc文件:

{
  "presets": [
    ["latest", {
      "es2015": { "modules": false }
    }]
  ]
}

5.webpack.config.js

詳解請看注釋:

var path = require('path');
var webpack = require('webpack');
var HtmlWebpackPlugin = require('html-webpack-plugin');
var ExtractTextPlugin = require('extract-text-webpack-plugin');
var CleanWebpackPlugin = require('clean-webpack-plugin');

var srcPath = path.join(__dirname, './src/');

/*-----------------根據(jù)process變量找到對應的webconfig文件-----------------*/
function getEnv() {
    var argv = process.argv.slice(2);
    for (var i = 0; i < argv.length; i++) {
        if (argv[i].indexOf('--env=') >= 0) {
            return argv[i].substr(6);
        }
    }
}
//webconfig是api配置文件。一般來說勤家,不同的環(huán)境后臺api地址會不同
//例如:test環(huán)境下腹尖,api為http://test.api.com; 
//release環(huán)境下,api為http://release.api.com; 
//需要根據(jù)不同的環(huán)境伐脖,把api配置給相應的ajax插件热幔,如vue-resource, axios
//例如,配置vue-resource: Vue.http.options.root = webconfig.host;
var env = getEnv();
var configPath = '';
switch (env) {
    case 'test' :
        configPath = path.join(__dirname, './src/config/webconfig_test.js');
        break;
    default :
        configPath = path.join(__dirname, './src/config/webconfig_release.js');
}
/*-----------------webpack 配置-----------------*/
module.exports = {
    //完整寫法為entry:{main:  './src/main.js'}讼庇,所以绎巨,[name]默認為"main"
    //也可以按照喜好自行定義[name]的名字
    entry: './src/main.js',
    output: {
        //必須是絕對路徑(所以這里用到的是path.resolve,而不是path.join)
        //指定文件打包的輸入目錄
        path: path.resolve(__dirname, './dist'),
        //output.path中的URL以HTML頁面為基準蠕啄,表示資源的發(fā)布地址
        //當配置過該屬性后场勤,打包文件中所有通過相對路徑引用的資源都會被配置的路徑所替換
        // webpack-dev-server也會默認從publicPath為基準,使用它來決定在哪個目錄下啟用服務介汹,來訪問webpack輸出的文件。
        publicPath: '/',
        // 指定輸出文件的名稱舶沛,[hash]會自動給文件名加上hash后綴
        filename: 'js/build-[hash].js',
        //異步加載的JS文件不會被打包到output->path下嘹承,所以需要為其做專門配置
        //[id]會自動為異步文件添加序列號
        //這里,和vue-router配合如庭,實現(xiàn)切換路由時按需加載JS文件
        chunkFilename: 'js/[id].build.js?[chunkhash]'
    },
    //注意:利用ExtractTextPlugin插件將css或者scss(require("style.css"))單獨打包到一個CSS文件
    //這樣叹卷,樣式不會內(nèi)聯(lián)到JS里面
    module: {
        rules: [
            {
                test: /\.vue$/,
                loader: 'vue-loader',
                options: {
                    loaders: {
                        // Since sass-loader (weirdly) has SCSS as its default parse mode, we map
                        // the "scss" and "sass" values for the lang attribute to the right configs here.
                        // other preprocessors should work out of the box, no loader config like this necessary.
                        'scss': 'vue-style-loader!css-loader!sass-loader',
                        'sass': 'vue-style-loader!css-loader!sass-loader?indentedSyntax'
                    }
                    // other vue-loader options go here
                }
            },
            {
                test: /\.js$/,
                loader: 'babel-loader',
                exclude: /node_modules/
            },
            {
                test: /\.css$/,
                loader: ExtractTextPlugin.extract({
                    fallbackLoader: 'style-loader',
                    loader: 'css-loader'
                })
            },
            {
                test: /\.scss$/,
                loader: ExtractTextPlugin.extract({
                    fallback: 'style-loader',
                    //resolve-url-loader may be chained before sass-loader if necessary
                    use: ['css-loader', 'sass-loader']
                })
            },
            {
                test: /\.(png|jpg|gif|svg|ico)$/,
                loader: 'file-loader',
                options: {
                    //圖片導出路徑
                    name: 'images/[name].[ext]'
                }
            }
        ]
    },
    resolve: {
        //模塊別名定義,方便后續(xù)直接引用別名
        //例如坪它,引用webconfig模塊骤竹,語法為: require('webconfig')
        alias: {
            'vue$': 'vue/dist/vue.esm.js',
            appCss: srcPath + 'sass/app.scss',
            favicon: srcPath + 'images/favicon.ico',
            webconfig: configPath,
            apiconfig: srcPath + 'config/apiconfig.js'
        }
    },
    //webpack-dev-server配置
    devServer: {
        historyApiFallback: true,
        noInfo: true,
        //指定服務器文件路徑
        contentBase: "./dist",
        port: 9002
    },
    performance: {
        //不展示警告或錯誤提示
        hints: false
    },
    //選擇一種source map來增強調(diào)試過程,該選項會影響構(gòu)建和重構(gòu)建的速度
    devtool: '#eval-source-map',
    plugins: [
        //定義全局插件往毡,不需要require()引入蒙揣,直接可以使用模塊名,如:webconfig.host;
        new webpack.ProvidePlugin({
            webconfig: 'webconfig',
            API_CONFIG_URL: "apiconfig",
        }),
        // 依據(jù)一個簡單的模板开瞭,幫你生成最終的Html5文件
        // 這個文件中自動引用了你打包后的JS文件懒震。
        // 每次編譯都在文件名中插入一個不同的哈希值
        new HtmlWebpackPlugin({
            template: __dirname + "/index.tpl.html",
            favicon: 'src/images/favicon.ico',
        }),
        //將CSS從JS文件中分離出來,并添加到輸出html文件中
        new ExtractTextPlugin('css/' + '[name]-[hash].css'),
        //每次build時嗤详,先清除dist包
        new CleanWebpackPlugin(['dist'], {
            verbose: true,
            dry: false
        })
    ]
};
//生成環(huán)境下的配置个扰,提供文件壓縮功能
if (process.env.NODE_ENV === 'production') {
    module.exports.devtool = '#source-map';
    // http://vue-loader.vuejs.org/en/workflow/production.html
    module.exports.plugins = (module.exports.plugins || []).concat([
        new webpack.DefinePlugin({
            'process.env': {
                NODE_ENV: '"production"'
            }
        }),
        new webpack.optimize.UglifyJsPlugin({
            sourceMap: true,
            compress: {
                warnings: false
            }
        }),
        new webpack.LoaderOptionsPlugin({
            minimize: true
        })
    ])
}

6. 用到的插件plugins

1). cross-env

cross-env用來設置環(huán)境變量。
Node環(huán)境中的環(huán)境變量為NODE_ENV葱色,用process.env.NODE_ENV訪問該變量递宅。
可以看到package.json中的scripts用到這個功能:

"scripts": {
    "dev": "cross-env NODE_ENV=development webpack-dev-server --open --hot --env=integrate"
  }
2). webpack-dev-server

webpack-dev-server提供了一個服務器和實時重載(live reloading)功能。
webpack-dev-server是一個小型的node.js Express服務器,它使用webpack-dev-middleware中間件來為通過webpack打包生成的資源文件提供Web服務。

3). html-webpack-plugin

該插件可以生成一個HTML5文件办龄,它可以動態(tài)添加script標簽加載webpack生成包烘绽。如果生成包帶hash值,那么土榴,就必須用這個插件了诀姚。

4). extract-text-webpack-plugin

將JavaScript中導入的CSS提取為單個CSS文件。

5). clean-webpack-plugin

刪除目標目錄下所有文件

更多高階內(nèi)容玷禽,可移步《小專欄-娜姐聊前端》赫段。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市矢赁,隨后出現(xiàn)的幾起案子糯笙,更是在濱河造成了極大的恐慌,老刑警劉巖撩银,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件给涕,死亡現(xiàn)場離奇詭異,居然都是意外死亡额获,警方通過查閱死者的電腦和手機够庙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抄邀,“玉大人耘眨,你說我怎么就攤上這事【成觯” “怎么了剔难?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長奥喻。 經(jīng)常有香客問我偶宫,道長,這世上最難降的妖魔是什么环鲤? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任纯趋,我火速辦了婚禮,結(jié)果婚禮上冷离,老公的妹妹穿的比我還像新娘结闸。我一直安慰自己,他們只是感情好酒朵,可當我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布桦锄。 她就那樣靜靜地躺著,像睡著了一般蔫耽。 火紅的嫁衣襯著肌膚如雪结耀。 梳的紋絲不亂的頭發(fā)上留夜,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天,我揣著相機與錄音图甜,去河邊找鬼碍粥。 笑死,一個胖子當著我的面吹牛黑毅,可吹牛的內(nèi)容都是我干的嚼摩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼矿瘦,長吁一口氣:“原來是場噩夢啊……” “哼枕面!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起缚去,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤潮秘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后易结,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體枕荞,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年搞动,在試婚紗的時候發(fā)現(xiàn)自己被綠了躏精。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡鹦肿,死狀恐怖矗烛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情狮惜,我是刑警寧澤高诺,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布碌识,位于F島的核電站碾篡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏筏餐。R本人自食惡果不足惜开泽,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望魁瞪。 院中可真熱鬧穆律,春花似錦、人聲如沸导俘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽旅薄。三九已至辅髓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背洛口。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工矫付, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人第焰。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓买优,卻偏偏與公主長得像,于是被迫代替她去往敵國和親挺举。 傳聞我的和親對象是個殘疾皇子杀赢,可洞房花燭夜當晚...
    茶點故事閱讀 45,455評論 2 359

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