webpack 實現的多入口項目腳手架

来源:http://www.cnblogs.com/givebest/archive/2017/06/25/7077255.html
-Advertisement-
Play Games

簡介 基於 webpack2 實現的多入口項目腳手架,主要使用 extract text webpack plugin 實現 js 、css 公共代碼提取,html webpack plugin 實現 html 多入口,less loader 實現 less 編譯,postcss loader 配置 ...


簡介

基於 webpack2 實現的多入口項目腳手架,主要使用 extract-text-webpack-plugin 實現 js 、css 公共代碼提取,html-webpack-plugin 實現 html 多入口,less-loader 實現 less 編譯,postcss-loader 配置 autoprefixer 實現自動添加瀏覽器相容首碼,html-withimg-loader 實現 html 內引入圖片版本號添加和模板功能,babel-loader 實現 ES6 轉碼功能, happypack 多線程加速構建速度。

目錄

├── dist                     # 構建後的目錄
├── config                   # 項目配置文件
│   ├── webpack.config.js    # webpack 配置文件
│   └── postcss.config.js    # postcss 配置文件
├── src                      # 程式源文件
│   └── js                   # 入口
│   ├   └── index.js         # 匹配 view/index.html
│   ├   └── user         
│   ├   ├    ├── index.js    # 匹配 view/user/index.html
│   ├   ├    ├── list.js     # 匹配 view/user/list.html
│   ├   └── lib              # JS 庫等,不參與路由匹配
│   ├       ├── jquery.js 
│   └── view                 
│   ├    └── index.html       # 對應 js/index.js
│   ├    └── user         
│   ├        ├── index.html   # 對應 js/user/index.js
│   ├        ├── list.html    # 對應 js/user/list.js
│   └── css                   # css 文件目錄
│   ├    └── base.css          
│   ├    └── iconfont.css     
│   └── font                  # iconfont 文件目錄
│   ├    └── iconfont.ttf         
│   ├    └── iconfont.css
│   └── img                   # 圖片文件目錄
│   ├    └── pic1.jpg         
│   ├    └── pic2.png     
│   └── template              # html 模板目錄
│       └── head.html         
│       └── foot.html            

配置

多入口

根據 JS 目錄獲取多入口數組

const ROOT = process.cwd();  // 根目錄

let entryJs = getEntry('./src/js/**/*.js');

/**
 * 根據目錄獲取入口
 * @param  {[type]} globPath [description]
 * @return {[type]}          [description]
 */
function getEntry (globPath) {
    let entries = {};
    Glob.sync(globPath).forEach(function (entry) {
        let basename = path.basename(entry, path.extname(entry)),
            pathname = path.dirname(entry);
        // js/lib/*.js 不作為入口
        if (!entry.match(/\/js\/lib\//)) {
            entries[pathname.split('/').splice(3).join('/') + '/' + basename] = pathname + '/' + basename;
        }
    });
    return entries;
}

// webpack 配置
const config = {
    entry: entryJs,
    output: {
        filename: 'js/[name].js?[chunkhash:8]',
        chunkFilename: 'js/[name].js?[chunkhash:8]',
        path: path.resolve(ROOT, 'dist'),
        publicPath: '/'
    },  
}

module

使用 babel 實現 ES2015 轉 ES5,less 轉 css 並使用 postcss 實現 autoprefixer 自動添加瀏覽器相容,url-loader 實現 css 引用圖片、字體添加版本號,html-withimg-loader 實現 html 引用圖片添加版本號並實現模板功能。

module: {
    rules: [
        {
            test: /\.js$/,
            exclude: /(node_modules|bower_components)/,
            use: {
                loader: 'babel-loader?id=js',
                options: {
                    presets: ['env']
                }
            }
        },
        {
            test: /\.(less|css)$/,
            use: ExtractTextPlugin.extract({
                fallback: 'style-loader?id=styles',
                use: [{
                        loader: 'css-loader?id=styles',
                        options: {
                            minimize:  !IsDev
                        }
                    }, 
                    {
                        loader: 'less-loader?id=styles'
                    }, 
                    {
                        loader: 'postcss-loader?id=styles',
                        options: {
                            config: {
                                path: PostcssConfigPath
                            }
                        }
                    }
                ]
            })
        },
        {
            test: /\.(png|jpg|gif)$/,
            use: [
                {
                    loader: 'url-loader',
                    options: {
                        limit: 100,
                        publicPath: '',
                        name: '/img/[name].[ext]?[hash:8]'
                    }
                }
            ]
        },
        {
            test: /\.(eot|svg|ttf|woff)$/,
            use: [
                {
                    loader: 'url-loader',
                    options: {
                        limit: 100,
                        publicPath: '',
                        name: '/font/[name].[ext]?[hash:8]'
                    }
                }
            ]
        },
        // @see https://github.com/wzsxyz/html-withimg-loader
        {
            test: /\.(htm|html)$/i,
            loader: 'html-withimg-loader?min=false'
        }
    ]
},


// postcss.config.js
module.exports = {
    plugins: [
        require('autoprefixer')({
            browsers: ['> 1%', 'last 5 versions', 'not ie <= 9'],
        })
    ]
}

View 視圖

根據目錄對應關係,獲取 js 對應的 html 入口

let entryHtml = getEntryHtml('./src/view/**/*.html'),
    configPlugins;

entryHtml.forEach(function (v) {
    configPlugins.push(new HtmlWebpackPlugin(v));
});

// webpack 配置
resolve: {
    alias: {
        views:  path.resolve(ROOT, './src/view')    
    }
},

/**
 * 根據目錄獲取 Html 入口
 * @param  {[type]} globPath [description]
 * @return {[type]}          [description]
 */
function getEntryHtml (globPath) {
    let entries = [];
    Glob.sync(globPath).forEach(function (entry) {
        let basename = path.basename(entry, path.extname(entry)),
            pathname = path.dirname(entry),
            // @see https://github.com/kangax/html-minifier#options-quick-reference
            minifyConfig = IsDev ? '' : {
                removeComments: true,
                collapseWhitespace: true,
                minifyCSS: true,
                minifyJS: true  
            };

        entries.push({
            filename: entry.split('/').splice(2).join('/'),
            template: entry,
            chunks: ['common', pathname.split('/').splice(3).join('/') + '/' + basename],
            minify: minifyConfig
        });

    });
    return entries;
}

plugins

使用 happypack 多線程加快構建速度,CommonsChunkPlugin 實現提取公用 js 為單獨文件,extract-text-webpack-plugin 實現提取公用 css 為單獨文件,

let configPlugins = [
    new HappyPack({
        id: 'js',
        // @see https://github.com/amireh/happypack
        threadPool: HappyThreadPool,
        loaders: ['babel-loader']
    }),
    new HappyPack({
        id: 'styles',
        threadPool: HappyThreadPool,
        loaders: ['style-loader', 'css-loader', 'less-loader', 'postcss-loader']
    }),
    new webpack.optimize.CommonsChunkPlugin({
        name: 'common'
    }),
    // @see https://github.com/webpack/webpack/tree/master/examples/multiple-entry-points-commons-chunk-css-bundle
    new ExtractTextPlugin({
        filename: 'css/[name].css?[contenthash:8]',
        allChunks: true
    })
];

entryHtml.forEach(function (v) {
    configPlugins.push(new HtmlWebpackPlugin(v));
});

// webpack 配置
plugins: configPlugins,

開發

webpack-dev-server 實現開發環境自動刷新等功能

// webpack 配置
devServer: {
    contentBase: [
        path.join(ROOT, 'src/')
    ],
    hot: false,
    host: '0.0.0.0',
    port: 8080
}

開發

npm start

http://localhost:8080/view

構建

cross-env 實現區分開發和生產環境構建

命令 說明
npm run dev 開發環境構建,不壓縮代碼
npm run build 生產環境構建,壓縮代碼

倉庫

歡迎 star

https://github.com/givebest/webpack2-multiple-entry

轉載請註明出處:http://blog.givebest.cn/webpack/2017/06/25/webpack-multiple-entry.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.首先下載resin: http://www.caucho.com/ 2.下載resin 的eclipse插件: 在eclipse的更新地址填上http://caucho.com/eclipse/ 3.eclipse-》視窗-》首選項-》java-》已安裝的JRE,添加本機的JRE6,而且要加上J ...
  • 1.網站全局統計變數類,只定義全局變數 1 package com.lt.listener; 2 3 import java.util.Date; 4 import java.util.HashMap; 5 import java.util.Map; 6 7 import javax.servlet ...
  • Java NIO原理分析 這裡主要圍繞著Java NIO展開,從Java NIO的基本使用,到介紹Linux下NIO API,再到Java 其底層的實現原理。 Java NIO基本使用 Linux下的NIO系統調用介紹 Selector原理 Channel和Buffer之間的堆外記憶體 Java NI ...
  • 題目要求: Given two binary trees, write a function to check if they are equal or not. Two binary trees are considered equal if they are structurally ident ...
  • 一 List映射 如果持久化類中具有List對象,可以通過映射文件中的類<list>元素或註解來映射List. 例如,一個問題有多個答案: 1)創建持久化類 2)創建映射文件 3)在全局配置文件中增加 4)測試 二 List一對多映射 一個問題有多個答案,每個答案有自己的信息,需要使用一對多關聯來映 ...
  • 1、對於C/C++的文件,文件頭應該有類似這樣的註釋: /************************************************************************ * * 文 件 名:network.c * * 文件描述:網路通訊函數集 * * 創 建 人:H ...
  • 準備篇 適用/適合人群:適合基礎小白 目標:掌握JavaSE。 ●技術點小節: 1.開發工具的安裝配置的介紹 2.JDK安裝 3.DOS環境編程 4.Eclipse的安裝使用 ●JAVA基礎 1.基本的語法規範 2.數據類型 3.流程式控制制 4.函數 ●初識JavaOOP 1.類,對象,面向編程思想 ...
  • 本人從事前端開發的工作,由於一直以來都沒有寫文章的習慣,很多東西不記下來就很容易忘記。如果可以親手把記下來的內容通過自己理解然後寫下來,那將會對所學的知識內容得到更深刻的印象和理解,將會對以後的工作更有幫助。 希望大家可以多多支持^_^ ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...