成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

摒棄gulp.js+require.js,使用webpack配置多頁(yè)面web項(xiàng)目

lingdududu / 396人閱讀

摘要:主要做了兩套方案,一套是基于的單頁(yè)應(yīng)用,還有一套就是多頁(yè)應(yīng)用。麻煩的是原先使用這個(gè)方案。這太麻煩了,還不如使用一步到位。后記暫時(shí)只做了這些,這套工具還沒(méi)有正式投入使用估計(jì)會(huì)有挺多問(wèn)題的。

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

前言

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

麻煩的是原先使用 gulp+require.js 這個(gè)方案。這個(gè)在我來(lái)公司之前就已經(jīng)存在,當(dāng)初我剛來(lái)的時(shí)候使用的是 grunt+require.js+jQuery(zepto)+sass ,然后我用這個(gè)第一次寫項(xiàng)目時(shí),實(shí)在受不了了 grunt 的緩慢,就換成了 gulp 。這次對(duì)于這個(gè)方案我本來(lái)也只是想小改一下,因?yàn)檫@個(gè)方案用著還行,我就想加個(gè) ES6 把 require.js 干掉,然后還有些其他小問(wèn)題的修復(fù)就好了。

然后按照想法開始給 gulp 任務(wù)里加上 babel 處理 ES6 。然后運(yùn)行,發(fā)現(xiàn)如果使用了ES6中的 module,通過(guò) importexport 進(jìn)行模塊化開發(fā),那么通過(guò)babel轉(zhuǎn)碼后,import、export會(huì)被轉(zhuǎn)成符合CMD規(guī)范的 requireexports 等,但是瀏覽器還是跑不了,這時(shí)還需要 bowserify 、webpack 、rollup 之類的對(duì)代碼再次進(jìn)行構(gòu)建。這太麻煩了,還不如使用 webpack 一步到位。嗯還是不能偷懶啊。

項(xiàng)目結(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 ,在這個(gè)文件中就是根據(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è)應(yīng)用所以對(duì)于入口文件的處理,這也是比較麻煩的一點(diǎn)。對(duì)于多入口文件的處理使用html-webpack-plugin這個(gè)插件。
在使用之前需要先獲取所有的html文件名稱,這個(gè)我是使用 node 的 fs 以及 path api 來(lái)獲取的:

/*獲取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配置,具體配置見(jiàn)github

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

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

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

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

// 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 等未模塊化的庫(kù)的處理

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

externals: {
    "zepto": "$"
}
preprocess

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

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

暫時(shí)只做了這些,這套工具還沒(méi)有正式投入使用估計(jì)會(huì)有挺多問(wèn)題的。后續(xù)有問(wèn)題會(huì)繼續(xù)補(bǔ)充

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/91990.html

相關(guān)文章

  • 前端構(gòu)建工具整理

    摘要:常見(jiàn)前端構(gòu)建工具的分類和對(duì)比是附帶的包管理器,是內(nèi)置的一個(gè)功能,允許在文件里面使用字段定義任務(wù)在這里,一個(gè)屬性對(duì)應(yīng)一段腳本,原理是通過(guò)調(diào)用去運(yùn)行腳本命令。 前文 端技術(shù)范圍不斷發(fā)展,前端開發(fā)不僅限于直接編寫html,css和javascript,Web應(yīng)用日益龐大,代碼也更加龐大,因此許多新的思想(例如模塊化和工程化等)和框架(React和Vue等),以及新的語(yǔ)言(Es6 TypeSc...

    leo108 評(píng)論0 收藏0
  • 20分鐘gulp快速入門

    摘要:所以出現(xiàn)了各種前端構(gòu)建化工具也應(yīng)運(yùn)而生等已經(jīng)成為現(xiàn)在前端開發(fā)工程師的必備技能之一。結(jié)語(yǔ)今天的分享就告一段落啦希望能對(duì)大家有所幫助。 在互聯(lián)網(wǎng)告訴發(fā)展的今天,自node出現(xiàn)后,我們前端也越來(lái)越大(心里美美噠~),同樣帶來(lái)的Web業(yè)務(wù)日益復(fù)雜化和多元化,模式也都想webPage模式轉(zhuǎn)向webApp模式,拼幾個(gè)頁(yè)面搞幾個(gè)jquery的插件就能搞一個(gè)完成一個(gè)項(xiàng)目的日子已經(jīng)是很久遠(yuǎn)的曾經(jīng)了,而且...

    RichardXG 評(píng)論0 收藏0
  • 基于 Gulp + Browserify 構(gòu)建 ES6 環(huán)境下的自動(dòng)化前端項(xiàng)目

    摘要:本文特此給大家介紹下如何使用配合來(lái)構(gòu)建基于的前端項(xiàng)目。最后,在目錄下會(huì)生成最終的項(xiàng)目文件。執(zhí)行單元測(cè)試本例中使用進(jìn)行單元測(cè)試。 隨著React、Angular2、Redux等前沿的前端框架越來(lái)越流行,使用webpack、gulp等工具構(gòu)建前端自動(dòng)化項(xiàng)目也隨之變得越來(lái)越重要。鑒于目前業(yè)界普遍更流行使用webpack來(lái)構(gòu)建es6(ECMAScript 2015)前端項(xiàng)目,網(wǎng)上的相關(guān)教程也比...

    yuanxin 評(píng)論0 收藏0
  • 教你如何打好根基快速入手react,vue,node

    摘要:謹(jǐn)記,請(qǐng)勿犯這樣的錯(cuò)誤。由于在之前的教程中,積累了堅(jiān)實(shí)的基礎(chǔ)。其實(shí),這是有緣由的其復(fù)雜度在早期的學(xué)習(xí)過(guò)程中,將會(huì)帶來(lái)災(zāi)難性的影響。該如何應(yīng)對(duì)對(duì)于來(lái)說(shuō),雖然有大量的學(xué)習(xí)計(jì)劃需要采取,且有大量的東西需要學(xué)習(xí)。 前言倘若你正在建造一間房子,那么為了能快點(diǎn)完成,你是否會(huì)跳過(guò)建造過(guò)程中的部分步驟?如在具體建設(shè)前先鋪設(shè)好部分石頭?或直接在一塊裸露的土地上先建立起墻面? 又假如你是在堆砌一個(gè)結(jié)婚蛋糕...

    ddongjian0000 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<