webpack4+react项目搭建(四)

作者: 幻城之雪 | 来源:发表于2023-05-02 13:38 被阅读0次

多页面配置

1.创建build/utils.js

1)获取入口文件

function getEntry(projectName) {
   let entries = {};
   if (projectName) {
      let obj = {};
      obj[projectName] = projectConfig.projects[projectName];
      entries = projectName === 'all' ? projectConfig.projects : obj;
   } else {
      entries = projectConfig.projects;
   }
   return entries;
}

2)获取出口文件

function getOutput(projectName) {
   let outPath = '';
   let outPublicPath = '';
   outPath = path.resolve(__dirname, '../dist');
   let output = {
     path: outPath,
     publicPath: outPublicPath,
     filename: '[name].js',
     chunkFilename: '[name].chunk.js',
     sourceMapFilename: '[file].map'
   };
   return output;
}

3)获取要清理的文件

function getCleanPath(projectName) {
   let arr = [];
   if (projectName) {
     arr = [path.resolve(process.cwd(), `dist/assets/${projectName}/`), path.resolve(process.cwd(), `dist/${projectName}/`), path.resolve(process.cwd(), `dist/${projectName}.js`), path.resolve(process.cwd(), `dist/css/${projectName}*.css`)];
   } else {
     arr = [path.resolve(process.cwd(), "dist/")];
   }
   return arr;
}

4)需要拷贝的资源路径

function getCopyPath(projectName) {
   let copyFromPath = '';
   let copyToPath = '';
   if (projectName) {
     copyFromPath = projectName === 'all' ? path.resolve(__dirname, '../src/assets') : path.resolve(__dirname, `../src/assets/${projectName}`);
     copyToPath = projectName === 'all' ? 'assets' : `assets/${projectName}`;
   } else {
     copyFromPath = path.resolve(__dirname, '../src/assets'  );
     copyToPath = 'assets';
   }
   return {
     from: copyFromPath,
     to: copyToPath
   };
}

2. 更改webpack配置文件

build/webpack.common.js
const { getCopyPath, getOutput, getEntry, getCleanPath } = require('./utils');
var projectName = process.argv.slice(2)[0];
function webpackCommonConfigCreator(options) {
  let obj = {
    mode: options.mode,
    entry: getEntry(projectName),
    output: getOutput(projectName)
    module: {
       rules: [
        {
          test: /\.(js|jsx)$/,
          include: path.resolve(__dirname, "../src"),
          use: [
          {
             loader: "babel-loader",
             options: {
                presets: ['@babel/preset-react'],
                plugins: ["react-hot-loader/babel"]
           }
         }
        ]
     },
     {
        test: /\.(css|scss)$/,
        include: path.resolve(__dirname, '../src'),
        use: ExtractTextPlugin.extract({
          fallback: "style-loader",
          use: [
           {
              loader: "css-loader",
              options: {
                modules: {
                  mode: "local",
                  localIdentName: '[path][name]_[local]--[hash:base64:5]'
                },
                localsConvention: 'camelCase'
              }

           },
           "sass-loader",
           {
              loader: "postcss-loader",
              options: {
                ident: 'postcss',
                plugins: loader => [
                   require('postcss-import')({ root: loader.resourcePath }),
                   require('autoprefixer')()
                ]
              }
            }
          ]
      })
    },
   {
      test: /\.(woff|woff2|eot|ttf|otf)$/,
      use: [{
         loader: 'file-loader',
         options: {
            name: '[name].[hash].[ext]'
         }
      }]
   },
   {
      test: /\.(jpg|png|svg|gif)$/,
      use: [
      {
       loader: 'url-loader',
       options: {
         limit: 10240,
         name: '[name].[hash].[ext]'
       }
      }
     ]
   }
  ]
},
plugins: [
   new CopyWebpckPlugin([{
     from: getCopyPath(projectName).from,
     to: getCopyPath(projectName).to
   }]),
   new CleanWebpackPlugin({
   cleanOnceBeforeBuildPatterns: getCleanPath(projectName) 
   }),
   new ExtractTextPlugin({
    filename: "css/[name][hash].css"
   })
]}
let arr = getHtmlPlugin(projectName);
if (arr.length > 0) {
   arr.forEach((item) => {
     obj.plugins.push(item);
   })
}
 return obj;
}
module.exports = webpackCommonConfigCreator;
 

相关文章

网友评论

    本文标题:webpack4+react项目搭建(四)

    本文链接:https://www.haomeiwen.com/subject/bywajdtx.html