webpack4.0配置多页面应用

本文详细介绍了一个基于Webpack的自动化构建流程,包括配置文件的编写、插件的使用、目录结构的组织,以及如何自动生成HTML页面和JS入口文件。通过遍历项目目录,动态生成对应的构建配置,实现模块化和高效构建。

项目目录

在这里插入图片描述
src内的目录结构如下:
在这里插入图片描述

webpack入口文件

webpac.config.js

const webpack = require('webpack');
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const ExtractTextWebpackPlugin = require('extract-text-webpack-plugin');
const UglifyjsWebpackPlugin = require('uglifyjs-webpack-plugin');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const traversdir = require('traversdir');
let cssExtract = new ExtractTextWebpackPlugin({
    filename: 'css/[name].css',
    allChunks: true
});
let lessExtract = new ExtractTextWebpackPlugin('css/[name].css');
const exportsObj = {
    entry:{},
    output:{
        path: path.resolve(__dirname, './dist'),
        // publicPath:"./",
        filename: 'js/[name].[hash].js',
        chunkFilename: 'js/[name].[hash].js'
    },
    module:{
        rules: [
            {
                test: /\.js/,
                include: [path.join(__dirname,'src')],
                loader: 'babel-loader',
            },
            {
                test: /\.less$/,
                loader: lessExtract.extract({
                    use: ["css-loader", "less-loader"],
                    publicPath: '../'
                })
            }, 
            {
                test: /\.css$/,
                loader: cssExtract.extract({
                    use: ["css-loader"],
                    publicPath: '../'
                })
            },
            { test: /\.html$/, loader: 'html-loader' },
            {
                test: /\.woff2?(\?[\s\S]+)?$/,
                loader: 'url?limit=10000&name=assets/fonts/[name].[ext]'
            },
            {
                test: /\.(svg|ttf|eot)(\?[\s\S]+)?$/,
                loader: 'file?limit=1000&name=assets/fonts/[name].[ext]'
            }, 
            {
                test: /\.(png|jpg|jpeg|gif)$/,
                loader: 'url-loader' ,
                options:{
                    limit:10000,
                    // publicPath:'./images',
                    name: 'images/[name].[hash:7].[ext]'
                }
            }
        ]
    },
    plugins:[
        cssExtract,
        lessExtract,
        new HtmlWebpackPlugin({
            title: '11',
            filename: 'index.html',
            template: path.join(__dirname,'src/index.html'),
            chunks: ['mainpage'],
            hash: true,// 会在引入的js里加入查询字符串避免缓存,
            minify: {
                removeAttributeQuotes: true
            }
        }),
        new UglifyjsWebpackPlugin(),
        new CleanWebpackPlugin({cleanOnceBeforeBuildPatterns:[path.join(__dirname, 'dist')]}),
        new CopyWebpackPlugin([{
            from: path.join(__dirname, 'static'),
            to: path.join(__dirname, 'dist', 'static')
        }]),
    ],
    devServer: {
        contentBase: './dist',
        host: 'localhost',
        port: 8000,
        compress: true,//服务器返回给浏览器的时候是否启动gzip压缩
    }
};

const pages_path = path.join(__dirname, './src/pages');
const pages_path_dir_object = traversdir(pages_path);
let pathArr = [];
function getPath (dir_object) {
  let dir = dir_object._dirs;
  if(dir.length) {
    dir.forEach(item => {
      let obj = {path:''}
      // 如果当前的目录中含有子目录
      if(dir_object[item]._dirs.length) {
        getPath(dir_object[item]);
      }
      let files = dir_object[item]._files;
        // 判断文件类型
        files.forEach(f => {
          let isJs = /\.js$/;
          let isHtml = /\.html$/;
          let isCss = /\.css$/;
          if(isJs.test(f)){
            obj.js = f;
          } else if(isHtml.test(f)) {
            obj.html = f;
          } else if(isCss.test(f)) {
            obj.css = f;
          }
        })

      if(dir_object._path === '/') {
        obj.path = item;
      } else {
        obj.path = (dir_object._path + '/' + item).replace(/\\/g,'');
      }
      pathArr.push(obj)
    })
  }
}
getPath(pages_path_dir_object);
//生成js
const obj = {};
pathArr.forEach(page => {
  if(page.js) {
    let name = page.js.replace('.js','');
    obj[name] = './src/pages/' + page.path + '/' + page.js;
  }
})
exportsObj.entry = Object.assign(exportsObj.entry, obj);
// 生成html
pathArr.forEach(page => {
  if(page.html) {
    const obj = {
        filename: 'pages/' +  page.path + '/' + page.html,
        template: path.join(__dirname,'src/pages/' +  page.path + '/' + page.html),
        chunks: [],
        hash: true,// 会在引入的js里加入查询字符串避免缓存,
        minify: {
            removeAttributeQuotes: true
        }
    };
    if(page.js) obj.chunks.push(page.js.replace('.js',''));
    const htmlPlugin = new HtmlWebpackPlugin(obj);
    exportsObj.plugins.push(htmlPlugin);
  }
});
module.exports = exportsObj;

打包后生成的目录如下

dist目录如下
在这里插入图片描述

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

绝对零度HCL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值