• 项目目录升级——webpack-merage扩展配置文件


    webpack-merge   扩展配置文件

     配置文件对比:

    webpack.coonfig.js

    const path = require('path');
    const isDev = process.env.NODE_ENV === 'development';
    const HTMLPlugin = require('html-webpack-plugin');
    const VueLoaderPlugin = require('vue-loader/lib/plugin');
    const ExtractPlugin = require('extract-text-webpack-plugin'); //把非js代码打包成单独的资源文件,提高效率
    const webpack = require('webpack');
    const config = {
      target: 'web',
      entry: path.join(__dirname, 'src/index.js'), //__dirname 当前文件所在的目录地址
      output: {
        filename: 'bundle.js',
        path: path.join(__dirname, 'dist'),
      },
      module: {
        rules: [
          {
            test: /.vue$/,
            loader: 'vue-loader',
          },
          {
            test: /.jsx$/,
            loader: 'babel-loader',
          },
          {
            test: /.(gif|jpg|jpeg|png|svg)$/,
            use: [
              {
                loader: 'url-loader',
                options: {
                  limit: 1024,
                  name: '[name]-aaa.[ext]',
                },
              },
            ],
          },
        ],
      },
      plugins: [
        new webpack.DefinePlugin({
          'process.env': {
            NODE_ENV: isDev ? '"development"' : '"production"',
          },
        }),
        new VueLoaderPlugin(),
        new HTMLPlugin(),
      ],
      mode: 'development',
    };
    //判断开发环境和正式环境   cross-env 运行跨平台设置和用环境变量的脚本
    if (isDev) {
      config.module.rules.push({
        test: /.styl/,
        use: [
          'style-loader',
          'css-loader',
          {
            loader: 'postcss-loader',
            options: {
              sourceMap: true,
            },
          },
          'stylus-loader',
        ],
      });
      config.devtool = '#cheap-module-eval-source-map';
      config.devServer = {
        port: 8000,
        host: '0.0.0.0',
        overlay: {
          errors: true,
        },
        hot: true,
        // open: true
      };
      config.plugins.push(
        new webpack.HotModuleReplacementPlugin(),
        new webpack.NoEmitOnErrorsPlugin()
      );
    } else {
        //正式环境
      // config.enter={
      //   app:path.join(__dirname,'src/index.js'),
      //   vender:['vue']//可以添加相关的第三方库
      // }
      config.output.filename = '[name].[chunkhash:8].js';
      config.module.rules.push({
        test: /.styl/,
        use: ExtractPlugin.extract({
          fallback: 'style-loader',
          use: [
            'css-loader',
            {
              loader: 'postcss-loader',
              options: {
                sourceMap: true,
              },
            },
            'stylus-loader',
          ],
        }),
      });
      config.plugins.push(
        new ExtractPlugin('styles.[contentHash:hex:8].css'),
        // new webpack.optimize.CommonsChunkPlugin({
        //   name:'vendor'
        // })
        );
        config.optimization={
          splitChunks:{
            cacheGroups:{
              commons:{
                name:'vender',
              }
            }
          },
          runtimeChunk:true
        }
    }
    module.exports = config;

    修改后,配置文件位于build下:

      webpack.config.base.js  //公共配置,基础配置

    const path = require('path');
    const config = {
      target: 'web',
      entry: path.join(__dirname, '../src/index.js'), //__dirname 当前文件所在的目录地址   注意这里的路径有修改
      output: {
        filename: 'bundle.js',
        path: path.join(__dirname, 'dist'),
      },
      module: {
        rules: [
          {
            test: /.vue$/,
            loader: 'vue-loader',
            exclude:/node_modules/  //node_modules中的.vue文件不需要编译
          },
          {
            test: /.jsx$/,
            loader: 'babel-loader',
          },
          {
            test: /.js$/,
            loader: 'babel-loader',
            exclude:__dirname+'node_modules',
            include:__dirname+'src',
            options: {
                presets: ['env']
            },
          },
          {
            test: /.(gif|jpg|jpeg|png|svg)$/,
            use: [
              {
                loader: 'url-loader',
                options: {
                  limit: 1024,
                  name: 'resources/[path][name].[hash:8].[ext]',
                },
              },
            ],
          },
        ],
      }
    };
    module.exports = config;

      webpack.config.client.js

    const path = require('path');
    const isDev = process.env.NODE_ENV === 'development';
    const HTMLPlugin = require('html-webpack-plugin');
    const ExtractPlugin = require('extract-text-webpack-plugin'); //把非js代码打包成单独的资源文件,提高效率
    const webpack = require('webpack');
    const merge=require('webpack-merge');
    const baseConfig=require('./webpack.config.base');
    const VueLoaderPlugin = require('vue-loader/lib/plugin');
    
    //判断开发环境和正式环境   cross-env 运行跨平台设置和用环境变量的脚本
    const defaultPlugins=[
      new webpack.DefinePlugin({
        'process.env':{
          NODE_ENV:isDev?'"development"':'"production"'
        }
      }),
      new VueLoaderPlugin(),
      new HTMLPlugin(),
    
    ]
    const devServer={
        port: 8000,
        host: '0.0.0.0',
        overlay: {
          errors: true,
        },
        hot: true,
        // open: true
      }
    let config
    if (isDev) {
    //第二个参数——对象会对第一个参数进行覆盖和补充 config
    =merge(baseConfig,{ module:{ rules:[{ test: /.styl/, use: [ 'style-loader', 'css-loader', { loader: 'postcss-loader', options: { sourceMap: true, }, }, 'stylus-loader', ], }] }, devtool:'#cheap-module-eval-source-map', devServer, plugins:defaultPlugins.concat([ new webpack.HotModuleReplacementPlugin(), new webpack.NoEmitOnErrorsPlugin() ]) }) } else { //正式环境 config=merge(baseConfig,{ enter:{ app:path.join(__dirname,'../src/index.js'), vendor:['vue'] }, output:{ filename:'[name].[chunkhash:8].js' }, module:{ rules:[ { test: /.styl/, use: ExtractPlugin.extract({ fallback: 'style-loader', use: [ 'css-loader', { loader: 'postcss-loader', options: { sourceMap: true, }, }, 'stylus-loader', ], }), } ] }, plugins:defaultPlugins.concat([ new ExtractPlugin('styles.[contentHash:hex:8].css'), ]), optimization:{ splitChunks:{ cacheGroups:{ commons:{ name:'vendor', } } }, runtimeChunk:true } }) } module.exports = config;

    package.json也需要进行相应的修改:

      "scripts": {
        "test": "echo "Error: no test specified" && exit 1",
        "build": "cross-env NODE_ENV=production webpack --config build/webpack.config.client.js","dev": "cross-env NODE_ENV=development webpack-dev-server --config build/webpack.config.client.js"
      },
  • 相关阅读:
    android和struts2实现android文件上传
    android--使用Struts2服务端与android交互
    Android与服务器端数据交互(http协议整合struts2+android)
    Android+struts2+JSON方式的手机开发(Login)
    MyEclipse6.5安装SVN插件的三种方法z
    Activity 怎样获得另一个xml布局文件的控件
    Android 自定义dialog(AlertDialog的修改样式)
    Android 用代码来实现selector
    Android 对话框弹出位置和透明度
    Android 对话框弹出位置和透明度的设置
  • 原文地址:https://www.cnblogs.com/em2464/p/12834893.html
Copyright © 2020-2023  润新知