zoukankan      html  css  js  c++  java
  • webpack搭建多页面应用优化版

    项目前期定的只有两页面所以entry入口文件直接写死的,后来又加了几个页面,还是遍历处理一下,不用一直改配置文件。

    改过之后的项目结构

    思路:使用fs插件读取pages下的目录名称,遍历得到pages下的每个目录的名称。然后入口文件配置每个目录下的index.js,html模版为每个目录下的index.html,然后每个js通过require引入相对应的index.scss。

    下面单独列出来

    /**
     * 遍历文件夹,把所有文件的路径拼到一个数组里,然后通过map获取到每一个文件
     * 
     */
    function getFolders(dir) {
        return fs.readdirSync(dir)
            .filter(function(file) {
                return fs.statSync(path.join(dir, file)).isDirectory();
            });
    }
    //获取pages下面的文件夹
    const folders = getFolders(pagePath);
    
    /**
     * 遍历文件夹自动添加entry
     */
    function addEntry(){
        let entryObj = {};
        folders.forEach(f=>{
            entryObj[f] = `${pagePath+f}/index.js`;
        });
        return entryObj;
    }
    //自动添加html
    folders.forEach(f=>{
        let htmlPlugin = {
            filename:`${f}.html`,
            template:`${pagePath+f}/index.html`,
            favicon:'./images/favicon.ico',
            chunks:[`${f}`],
            inject: true,
            hash:true,
            minify: {
                removeComments: true,
                collapseWhitespace: true
            }
        }
        config.plugins.push(new HtmlWebpackPlugin(htmlPlugin));
    })

    以下是优化的完整代码

    //引入路径插件
    const path = require('path');
    //引入遍历文件夹的插件
    const fs = require('fs');
    //引入导出html插件
    const HtmlWebpackPlugin = require('html-webpack-plugin');
    //引入清除插件
    const CleanWebpackPlugin = require('clean-webpack-plugin');
    //引入导出css插件
    const ExtractTextPlugin = require('extract-text-webpack-plugin');
    //引入webpack
    const webpack  = require('webpack');
    //引入压缩css的插件
    const optimizeCss = require('optimize-css-assets-webpack-plugin');
    //引入cssnano插件
    const cssnano = require('cssnano');
    //兼容ie8的插件
    const es3ifyPlugin = require('es3ify-webpack-plugin');
    //引入js压缩插件
    const uglifyjs = require('uglifyjs-webpack-plugin');
    //定义webpak.config.js相对于pages的路径
    const pagePath = './pages/';
    
    /**
     * 遍历文件夹,把所有文件的路径拼到一个数组里,然后通过map获取到每一个文件
     * 
     */
    function getFolders(dir) {
        return fs.readdirSync(dir)
            .filter(function(file) {
                return fs.statSync(path.join(dir, file)).isDirectory();
            });
    }
    //获取pages下面的文件夹
    const folders = getFolders(pagePath);
    
    /**
     * 遍历文件夹自动添加entry
     */
    function addEntry(){
        let entryObj = {};
        folders.forEach(f=>{
            entryObj[f] = `${pagePath+f}/index.js`;
        });
        return entryObj;
    }
    
    
    //webpack配置内容
    const config = {
        //入口
        entry:addEntry(),
        //便于调试
        devtool:'inline-source-map',
        //服务
        devServer:{
            contentBase:'build'
        },
        //loader模块
        module:{
            rules: [
               {//ES6
                test:/.js$/,
                loader:'babel-loader',
                // exclude:__dirname+'node_modules',//不对这个进行babel转换,这里边已经打包好,这样能减少打包时间
                // include:__dirname+'src'这里的src是你要编译的js文件的目录,
                exclude:path.resolve(__dirname,'node_modules'),
                include:path.resolve(__dirname,'../webapp'),
                query:{//若在package.json中定义了这个presets,则这边可以删掉
                    presets:['es2015','es2015-loose'],
                    ignore :[ './lib/webuploader/*.js']
                }
              },
              {
                test: /.js$/,
                enforce: 'post', // post-loader处理
                loader: 'es3ify-loader'
              },
              {//Jquery
                test: require.resolve('jquery'),
                use: [{
                  loader: 'expose-loader',
                  options: 'jQuery'
                },{
                  loader: 'expose-loader',
                  options: '$'
                }]
              },
              {//CSS
                  test:/.css/,
                  use:ExtractTextPlugin.extract({
                      use:['css-loader']
                  })
              },
              {//Sass
                  test:/.scss/,
                  use:ExtractTextPlugin.extract({
                      fallback:"style-loader",
                      use:['css-loader','sass-loader']
                  },)
              },
              {//处理模块html
                test: /.html$/,
                use: 'html-loader'
              },
              {//图片
                test: /.(jpg|png|gif)$/,
                use: {
                    loader: 'file-loader',
                    options: {
                        outputPath: 'images'
                    }
                }
              },
              //字体图标
                {
                test: /.(eot|svg|ttf|woff|woff2)w*/,
                loader: 'file-loader'
              },
              {
                test: /.htc$/,            
                loader: 'file-loader'
              },
              {
                test: /.swf$/,            
                loader: 'url-loader'
              }
            ]
        },
        //插件
        plugins: [        
            //全局引入jquery
            new webpack.ProvidePlugin({
              $: "jquery",
              jQuery: "jquery",
              jquery: "jquery",
              "window.jQuery": "jquery",
              identifier: ['es5-shim', 'es5-shim/es5-sham'],
            }),
            //清空build文件下的多余文件
            new CleanWebpackPlugin(['build']),
            //将css单独打包插件
            new ExtractTextPlugin({
              filename:"[name].css",//制定编译后的文件名称
              allChunks:true,//把分割的块分别打包
            }),
            //压缩css
            new optimizeCss({
              assetNameRegExp: /.style.css$/g,
              cssProcessor: cssnano,
              cssProcessorOptions: { discardComments: { removeAll: true } },
              canPrint: true
            }),
            //压缩js
            new uglifyjs({
                parallel:true,
                include://node_modules/,
                uglifyOptions:{
                    ie8:true
                }
            }),
            new es3ifyPlugin()
        ],
        //压缩优化css
        optimization: {
            // minimize: true,
            minimizer: [new optimizeCss({})]
        },
        //出口
        output:{
            filename: '[name].bundle.js',
            path: path.resolve(__dirname,'build')        
        }
    }
    
    //自动添加html
    folders.forEach(f=>{
        let htmlPlugin = {
            filename:`${f}.html`,
            template:`${pagePath+f}/index.html`,
            favicon:'./images/favicon.ico',
            chunks:[`${f}`],
            inject: true,
            hash:true,
            minify: {
                removeComments: true,
                collapseWhitespace: true
            }
        }
        config.plugins.push(new HtmlWebpackPlugin(htmlPlugin));
    })
    
    module.exports = config;
  • 相关阅读:
    【转】c#基础系列1---深入理解值类型和引用类型
    【转】Aspnet Core为什么支持跨平台
    [翻译svg教程]svg学习系列 开篇
    使用docker 解决一个小问题,你也可能用的到
    增加软链接
    漫长的表白
    被社会抽了一巴掌
    杂乱五章的2015年终总结
    [资源分享]yslow 与firebug 修复版本Firefox35【绿色版本下载】
    Web前端性能测试-性能测试知多少---深入分析前端站点的性能
  • 原文地址:https://www.cnblogs.com/hess/p/10167184.html
Copyright © 2011-2022 走看看