摒棄gulp.js+require.js才避,使用webpack配置多頁面web項目

不想看下面廢話的橱夭,可以直接看這里

前言

這兩周負(fù)責(zé)公司前端基礎(chǔ)工程的建設(shè)工扎。主要做了兩套方案徘钥,一套是基于vue的單頁應(yīng)用,還有一套就是多頁應(yīng)用肢娘。對于vue單頁這塊是沒什么問題的呈础,直接用vue-cli生成項目,再懟上vue全家桶以及一些工具函數(shù)橱健,然后規(guī)范一下目錄結(jié)構(gòu)啥的基本就ok了而钞。

麻煩的是原先使用 gulp+require.js 這個方案。這個在我來公司之前就已經(jīng)存在拘荡,當(dāng)初我剛來的時候使用的是 grunt+require.js+jQuery(zepto)+sass 臼节,然后我用這個第一次寫項目時,實在受不了了 grunt 的緩慢珊皿,就換成了 gulp 网缝。這次對于這個方案我本來也只是想小改一下,因為這個方案用著還行蟋定,我就想加個 ES6 把 require.js 干掉粉臊,然后還有些其他小問題的修復(fù)就好了。

然后按照想法開始給 gulp 任務(wù)里加上 babel 處理 ES6 驶兜。然后運行扼仲,發(fā)現(xiàn)如果使用了ES6中的 module,通過 import抄淑、export 進(jìn)行模塊化開發(fā)屠凶,那么通過babel轉(zhuǎn)碼后,import肆资、export會被轉(zhuǎn)成符合CMD規(guī)范的 requireexports 等矗愧,但是瀏覽器還是跑不了,這時還需要 bowserify 迅耘、webpack 贱枣、rollup 之類的對代碼再次進(jìn)行構(gòu)建监署。這太麻煩了颤专,還不如使用 webpack 一步到位纽哥。嗯還是不能偷懶啊。

項目結(jié)構(gòu)

├── build # webpack處理目錄
│   ├── build.js
│   ├── config.js
│   ├── run-env.js
│   ├── utils.js
│   ├── webpack.config.base.js
│   ├── webpack.config.dev.js
│   └── webpack.config.prod.js
├── dist # 打包之后的文件目錄
│   ├── commons.bundle.js
│   ├── css
│   │   ├── index.eb8584e93d4fbcbec235.css
│   │   └── test.eb8584e93d4fbcbec235.css
│   ├── img
│   │   └── test.d7a9b40f5bed4003db2585ba1bf24d86.jpg
│   ├── index.html
│   ├── js
│   │   ├── index.bundle.eb8584e93d4fbcbec235.js
│   │   └── test.bundle.eb8584e93d4fbcbec235.js
│   └── test.html
├── src # 源文件
│   ├── css
│   │   ├── base.scss
│   │   ├── index.scss
│   │   ├── test.scss
│   │   └── var.scss
│   ├── html
│   │   ├── index.html
│   │   └── test.html
│   ├── img
│   │   └── test.jpg
│   └── js
│       ├── app
│       │   ├── index.js
│       │   └── test.js
│       ├── base
│       └── component
├── webpack.config.js # webpack入口

package.json

先看下package.json里的命令和依賴

script:

"scripts": {
        "init-page": "node ./init-page.js",
        "dev": "export NODE_ENV=development && webpack-dev-server --open",
        "build": "export NODE_ENV=production && node ./build/build.js"
    }

依賴:

"devDependencies": {
        "babel-core": "^6.26.0",
        "babel-loader": "^7.1.2",
        "babel-preset-env": "^1.6.0",
        "clean-webpack-plugin": "^0.1.17",
        "css-loader": "^0.28.7",
        "eslint": "^4.10.0",
        "eslint-config-standard": "^10.2.1",
        "eslint-plugin-html": "^3.2.2",
        "eslint-plugin-import": "^2.8.0",
        "eslint-plugin-node": "^5.2.1",
        "eslint-plugin-promise": "^3.6.0",
        "eslint-plugin-standard": "^3.0.1",
        "exports-loader": "^0.6.4",
        "extract-text-webpack-plugin": "^3.0.1",
        "file-loader": "^1.1.5",
        "html-webpack-plugin": "^2.30.1",
        "html-withimg-loader": "^0.1.16",
        "node-sass": "^4.5.3",
        "postcss-loader": "^2.0.7",
        "preprocess-loader": "^0.2.2",
        "sass-loader": "^6.0.6",
        "script-loader": "^0.7.2",
        "style-loader": "^0.19.0",
        "url-loader": "^0.6.2",
        "webpack": "^3.7.1",
        "webpack-dev-server": "^2.9.1",
        "webpack-merge": "^4.1.0"
    }

webpack 入口配置

webpack的入口文件是 webpack.config.js 栖秕,在這個文件中就是根據(jù)命令執(zhí)行相應(yīng)的 webpack 配置:

const env = process.env.NODE_ENV === 'production' ? 'prod' : 'dev';
// 根據(jù)環(huán)境執(zhí)行指定文件
module.exports = require(`./build/webpack.config.${env}.js`);

webpack 基礎(chǔ)配置

webpack.base.config.js 中就是webpack的一些常規(guī)處理包括loader以及一些文件清理啥的春塌。由于要配置的是多頁應(yīng)用所以對于入口文件的處理,這也是比較麻煩的一點簇捍。對于多入口文件的處理使用html-webpack-plugin這個插件只壳。
在使用之前需要先獲取所有的html文件名稱,這個我是使用 node 的 fs 以及 path api 來獲取的:

/*獲取html文件名*/
module.exports = {
    getFileNameList(path) {
        let fileList = [];
        let dirList = fs.readdirSync(path);
        dirList.forEach(item => {
            if (item.indexOf('html') > -1) {
                fileList.push(item.split('.')[0]);
            }
        });
        return fileList;
    }
};

然后再處理webpack入口以及 html plugin:

// 入口html數(shù)組
let HTMLDirs = utils.getFileNameList('./src/html');

let HTMLPlugins = [];

// 入口文件集合處理
let entries = {};
HTMLDirs.forEach(page => {
    const htmlPlugin = new HTMLWebpackPlugin({
        filename: `${page}.html`,
        template: path.resolve(__dirname, `../src/html/${page}.html`),
        chunks: [page, 'commons']
    });
    HTMLPlugins.push(htmlPlugin);
    entries[page] = path.resolve(__dirname, `../src/js/app/${page}.js`);
});

相關(guān)webpack配置暑塑,具體配置見github

// webpack配置
module.exports = {
    entry: entries,
    ...
    plugins: [
        // 自動生成 HTML 插件
        ...HTMLPlugins
    ]
};

最復(fù)雜的麻煩的都在base中干完了吼句,本地開發(fā)和打包build只要做一些簡單的處理就ok了

webpack 本地開發(fā)文件配置與打包線上文件配置

本地與線上的配置文件,需要先合并 base 里的配置(使用 webpack-merge 可以處理這個工作)事格,然后做一下簡單處理即可惕艳。

// dev
module.exports = webpackMerge(webpackBase, {
    devServer: {
        contentBase: config.devServerOutputPath,
        overlay: {
            errors: true,
            warnings: true
        }
    }
});
// prod
module.exports = webpackMerge(webpackBase, {
    devtool: false,
    plugins: [
        // 代碼壓縮
        new webpack.optimize.UglifyJsPlugin({
            compress: {
                warnings: false
            }
        }),
        // 提取公共 JavaScript 代碼
        new webpack.optimize.CommonsChunkPlugin({
            // chunk 名為 commons
            name: 'commons',
            filename: '[name].bundle.js'
        })
    ]
});

zepto 等未模塊化的庫的處理

在處理zepto之類的未模塊化的庫的時候我采取的方案是cdn加載,然后webpack配置里加上外部擴(kuò)展即可
externals 可以防止將某些 import 的包(package)打包到 bundle 中驹愚,而是在運行時(runtime)再去從外部獲取這些擴(kuò)展依賴(external dependencies))

externals: {
    'zepto': '$'
}

preprocess

之前這套方案是要做三端的H5以及嵌入android远搪、ios的webview,所以需要根據(jù)平臺做一些特殊處理逢捺。gulp里有gulp-preprocess可以比較好的處理谁鳍,在webpack中可以使用 preprocess-loader 來處理。

{
    test: /\.(html|js|css|scss)$/,
    loader: `preprocess-loader?${runEnv}`
}

后記

暫時只做了這些劫瞳,這套工具還沒有正式投入使用估計會有挺多問題的倘潜。后續(xù)有問題會繼續(xù)補充。

感謝您的閱讀志于,本文由 趙的拇指 版權(quán)所有涮因。原文地址: https://www.zhaofinger.com/detail/11

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市恨憎,隨后出現(xiàn)的幾起案子蕊退,更是在濱河造成了極大的恐慌,老刑警劉巖憔恳,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瓤荔,死亡現(xiàn)場離奇詭異,居然都是意外死亡钥组,警方通過查閱死者的電腦和手機(jī)输硝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來程梦,“玉大人点把,你說我怎么就攤上這事橘荠。” “怎么了郎逃?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵哥童,是天一觀的道長。 經(jīng)常有香客問我褒翰,道長贮懈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任优训,我火速辦了婚禮朵你,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘揣非。我一直安慰自己抡医,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布早敬。 她就那樣靜靜地躺著忌傻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪搁嗓。 梳的紋絲不亂的頭發(fā)上芯勘,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機(jī)與錄音腺逛,去河邊找鬼荷愕。 笑死,一個胖子當(dāng)著我的面吹牛棍矛,可吹牛的內(nèi)容都是我干的安疗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼够委,長吁一口氣:“原來是場噩夢啊……” “哼荐类!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起茁帽,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤玉罐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后潘拨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吊输,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年铁追,在試婚紗的時候發(fā)現(xiàn)自己被綠了季蚂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖扭屁,靈堂內(nèi)的尸體忽然破棺而出算谈,到底是詐尸還是另有隱情,我是刑警寧澤料滥,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布然眼,位于F島的核電站,受9級特大地震影響幔欧,放射性物質(zhì)發(fā)生泄漏罪治。R本人自食惡果不足惜丽声,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一礁蔗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧雁社,春花似錦浴井、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至徒坡,卻和暖如春撕氧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背喇完。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工伦泥, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人锦溪。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓不脯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親刻诊。 傳聞我的和親對象是個殘疾皇子防楷,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,779評論 2 354

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

  • 在現(xiàn)在的前端開發(fā)中,前后端分離则涯、模塊化開發(fā)复局、版本控制、文件合并與壓縮粟判、mock數(shù)據(jù)等等一些原本后端的思想開始...
    Charlot閱讀 5,439評論 1 32
  • 版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。 webpack介紹和使用 一彤断、webpack介紹 1野舶、由來 ...
    it筱竹閱讀 11,121評論 0 21
  • gulpjs是一個前端構(gòu)建工具,與gruntjs相比宰衙,gulpjs無需寫一大堆繁雜的配置參數(shù)平道,API也非常簡單,學(xué)...
    依依玖玥閱讀 3,152評論 7 55
  • gulpjs是一個前端構(gòu)建工具供炼,與gruntjs相比一屋,gulpjs無需寫一大堆繁雜的配置參數(shù),API也非常簡單袋哼,學(xué)...
    井皮皮閱讀 1,296評論 0 10
  • 當(dāng)眾安保險在使用互聯(lián)網(wǎng)保險這個詞的時候冀墨,它所試圖展現(xiàn)在我們面前的是一個完全互聯(lián)網(wǎng)化的保險公司。 沒有線下的代理銷售...
    何夕一言堂閱讀 814評論 0 4