重写webpack多页运用设置脚手架

之前写了一个webpack多页运用的设置,只要一个webpack.config.js文件,完成了多进口设置打包css,js,资本文件处置惩罚。由于进口entry设置须要本身增加,HtmlWebpackPlugin有多少个页面也要本身增加。如许看来虽然设置是胜利的,但过于机械化,是不可取的

为何要举行多页运用设置?

我们都晓得开辟vue,react这些运用时,平常都只要一个进口文件。而且官方都供应了本身的脚手架。可谓是很烦琐,偏离本身现实开辟的环境时,这些脚手架就不能满足我们的请求了。虽然也有许多他人写的多页设置,然则觉得设置模块星散过于严峻,而且满足不了本身的需求,不适合新手进修运用。

许多传统网页的开辟照样要写许多静态界面,比方我们公司,官网展现类的网站。假如要根据传统的开辟形式,我们要为差别的页面增加css文件,js文件,如许大大的增加了工作量,而且很死板。而且不能运用es6,scss.

所以这个webpack多页设置就是为了处理这些题目,拥抱es6.

完全设置:
webpack-M-pages

读取页面,举行多进口设置

本着商定大于设置的准绳,我们对页面文件的安排举行肯定的束缚。
坚持html文件名与进口js文件名一致,运用glob模块,动态读取文件夹天生设置

└─pages //页面设置目次
        ├─index
        │      index.html
        │      index.js
        │      
        ├─pageA
        │      pageA.html
        │      pageA.js
        │      
        └─pageB
                pageB.html
                pageB.js

先看下脚手架的目次

│  .babelrc
│  .gitignore
│  .postcssrc.js
│  getEntrys.js
│  package-lock.json
│  package.json
│  README.md
│  webpack.config.js
│  
├─config
│      base.plugin.js //包括动态天生HtmlWebpackPlugin
│      entrys.js  //动态进口与HtmlWebpackPlugin动态天生
│      utils.js
│      
└─src
    ├─assets
    │  ├─css
    │  │  │  bootstrap.css
    │  │  │  index.scss
    │  │  │  
    │  │  ├─pageA
    │  │  │      a.css
    │  │  │      as.scss
    │  │  │      
    │  │  ├─pageB
    │  │  │      b.css
    │  │  │      bb.scss
    │  │  │      
    │  │  └─pageC
    │  │          c.css
    │  │          
    │  ├─fonts
    │  │      glyphicons-halflings-regular.eot
    │  │      glyphicons-halflings-regular.svg
    │  │      glyphicons-halflings-regular.ttf
    │  │      glyphicons-halflings-regular.woff
    │  │      glyphicons-halflings-regular.woff2
    │  │      
    │  └─img
    │          ph.jpg
    │          
    ├─common
    │  ├─css
    │  │      reset.css
    │  │      
    │  └─js
    │          common.js
    │          
    ├─js
    │  │  testm.js
    │  │  
    │  └─other
    │          a.js
    │          b.js
    │          
    ├─lib
    │      test.js
    │      
    └─pages //页面设置目次
        ├─index
        │      index.html
        │      index.js
        │      
        ├─pageA
        │      pageA.html
        │      pageA.js
        │      
        └─pageB
                pageB.html
                pageB.js
            

自动注入entry设置

webpack的entry设置是如许的

module.exports = {
    devtool: '#source-map',
    entry:{
        index:'',
        about:'',
        home:'',
        .....
       }
    }

动态读取html页面,设置多进口

//entrys.js
var glob = require('glob')
var path = require('path')

var PAGES_DIR = path.resolve(__dirname, '../src/pages')

exports.entries = function () {
    var entryFiles = glob.sync(PAGES_DIR + '/*/*.js')
    var resultEntry = {}
    entryFiles.forEach(filePath => {
        var filename = filePath.substring(filePath.lastIndexOf('\/') + 1, filePath.lastIndexOf('.'))
        resultEntry[filename] = filePath
    })
    return resultEntry
}

OK,如许我们的进口设置文件就能够如许简写了。

const { entries } = require("./config/entrys");
module.exports = {
    devtool: '#source-map',
    entry: entries(),
    
    }

HtmlWebpackPlugin

这个实在就和自动注入entry设置一样,所以我们先看下 HtmlWebpackPlugin的设置

new HtmlWebpackPlugin({
    template: 'index.html',
    filename: 'index.html',
    chunks: ["vendors",'index'],
    // hash:true,
    minify: {
      removeComments: true,
      collapseWhitespace: false //删除空白符与换行符
    }
  });

动态设置 HtmlWebpackPlugin

//读取html文件
exports.htmlPages = function () {
    var entryHtmls = glob.sync(PAGES_DIR + '/*/*.html')
    var resultHtmlPages = []

    entryHtmls.forEach(filePath => {
        var filename = filePath.substring(filePath.lastIndexOf('\/') + 1, filePath.lastIndexOf('.'))

        var htmlPlugin = {
            template: filePath,
            filename: filename + '.html',
            chunks: filename,
            inject: true
        }

        resultHtmlPages.push(htmlPlugin)

    })

    return resultHtmlPages
}

遍历页面,增加设置

/*遍历页面,增加设置*/
let { htmlPages } = require("./entrys");
let pageArr = htmlPages();

pageArr.forEach(page => {
  const htmlPlugin = new HtmlWebpackPlugin({
    template: page.template,
    filename: page.filename,
    chunks: ["vendors", page.chunks],
    // hash:true,
    minify: {
      removeComments: true,
      collapseWhitespace: false //删除空白符与换行符
    }
  });
  base_plugin.push(htmlPlugin);
});

优化chunks

let chunksArr = [];
pageArr.forEach(page => {
  chunksArr.push(page.chunks);
});

new webpack.optimize.CommonsChunkPlugin({
    name: "vendors",
    chunks: chunksArr, //提取公用模块
    minChunks: Infinity
  }),

温馨提醒

如安在windows下运用cmd敕令天生文件树?

tree /f > tree.txt
    原文作者:nicezhu
    原文地址: https://segmentfault.com/a/1190000009916612
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞