zoukankan      html  css  js  c++  java
  • webpack动态配置多静态资源路径,动态配置多上线路径,配置less,多种图片引用方式----"webpack": "^4.41.6",

    1.项目场景是有两个静态资源目录,一个用于开发,一个用于发布,上线多个版本,打包多个版本后,也要部署到同一个服务器的同一个端口下.

    根据我自己的摸索,我搞出来了下面的配置,自感觉还蛮好用的

    先看我的config.js 用来控制所有的静态资源目录和打包上线路径,

    // /public/config.js 除了以下的配置之外,这里面还可以有许多其他配置,例如,pulicPath 的路径等等
    module.exports = {
      dev: {
        template: {
          title: '开发的时候的系统名字',
          header: false,
          footer: false,
          publicPath: '/', 
          publicStaticPath: '../',
          // assetsPath: 'assets/' // 开发正常用
          assetsPath: 'assets_All/' // 开发测试用--这里有很多用不到的模型以及图片,模型太大,为避免被打包,所以用这个了
    
        }
      },
      build: {
        template: {
          title: '我的友好系统',
          header:true,
          footer:false,
          publicPath: '/hahaha/', // 打包上线之前要改一下这个哦TODU-LIST
          publicStaticPath: '/hahaha/', // 打包上线之前要改一下这个哦TODU-LIST
          // publicPath: '/hahaha1111/', // 打包上线之前要改一下这个哦TODU-LIST
          // publicStaticPath: '/hahaha1111/' // 打包上线之前要改一下这个哦TODU-LIST
          // publicPath: '/hahaha22222/', // 打包上线之前要改一下这个哦TODU-LIST
          // publicStaticPath: '/hahaha22222/' // 打包上线之前要改一下这个哦TODU-LIST,
          assetsPath: 'assets/'
        }
      }
    }
    

    再来看一下我的webpack.config.js 用到了上面的配置,但是基本上一般什么都不用动哦~~~

    // 如果有額外的.babelrc配置的話就可以使用這段代碼1
    // module.exports = {
    //   module: {
    //     rules: [
    //       {
    //         test:/.jsx?$/,
    //         use: ['babel-loader'],
    //         exclude:/node_modules/  //排除 node_modules目錄
    //       }
    //     ]
    //   }
    // }
    // 如果有額外的.babelrc配置的話就可以使用這段代碼2
    // 在webpack中配置 babel,如果沒有額外的.babelrc配置的話就可以使用這段代碼1
    //webpack.config.js
    // 首先引入插件1
    // 导入terser-webpack-plugin-->减少js体积(其中删除js的console.log和注释)
    const TerserWebpackPlugin = require('terser-webpack-plugin')
    // 实例化TerserWebpackPlugin对象
    const terserPlugin = new TerserWebpackPlugin({
      parallel: 4,
      extractComments: true,
      terserOptions: {
        compress: {
          warnings: false,
          drop_console: true,
          drop_debugger: true,
          pure_funcs: ['console.log'], //移除console
        },
      },
    })
    const HtmlWebpackPlugin = require('html-webpack-plugin')
    const CopyWebpackPlugin = require('copy-webpack-plugin')
    const isDev = process.env.NODE_ENV.trim() === 'development' //html-webpack-plugin 的 config 的妙用4-1
    const { CleanWebpackPlugin } = require('clean-webpack-plugin') //清理dist目錄的插件
    const path = require('path') //設置出口使用
    const config = require('./public/config')[isDev ? 'dev' : 'build'] //html-webpack-plugin 的 config 的妙用4-2
    module.exports = {
      entry: './src/index.js', //webpack的默認配置,也可以寫一個數組
      output: {
        path: path.resolve(__dirname, 'dist'), //必須是絕對路徑
        // filename: 'bundle.js',
        // filename: 'bundle.[hash].js',
        filename: 'bundle.[hash:6].js', //考虑到CDN缓存的问题,我们一般会给文件名加上 hash
        publicPath: config.template.publicPath
      },
      mode: isDev ? 'development' : 'production', //html-webpack-plugin 的 config 的妙用4-3
      module: {
        rules: [
          {
            test: /.jsx?$/,
            use: {
              loader: 'babel-loader',
              options: {
                presets: ['@babel/preset-env'],
                plugins: [
                  [
                    '@babel/plugin-transform-runtime',
                    {
                      corejs: 3,
                    },
                  ],
                ],
              },
            },
            exclude: /node_modules|jsm|models/,
          },
          {
            //看清楚啦  這裡有四個loaderloader 的执行顺序是从右向左执行的,也就是后面的 loader 先执行,上面 loader 的执行顺序为: less-loader ---> postcss-loader ---> css-loader ---> style-loader
            test: /.(le|c)ss$/,
            use: [
              'style-loader',
              'css-loader',
              {
                loader: 'postcss-loader',
                options: {
                  plugins: function () {
                    return [
                      require('autoprefixer')({
                        overrideBrowserslist: ['>0.25%', 'not dead'],
                      }),
                    ]
                  },
                },
              },
              'less-loader',
            ],
            exclude: /node_modules/,
          },
          {
            test: /.(png|jpg|gif|jpeg|webp|svg|eot|gltf|ttf|woff|woff2)$/,
            use: [
              {
                loader: 'url-loader',
                // options: {
                //     limit: 10240, //10K
                //     esModule: false
                // }
                // ,
                // 使用上面的那一段運行後會把圖片名字改為MD5哈希值,使用下面的會保留原有名稱加上六位哈希值
                options: {
                  limit: 10240, //10K
                  esModule: false,
                  name: '[name]_[hash:0].[ext]',
                  outputPath: config.template.assetsPath, //這個可以將打包後的資源放到指定的文件夾下
                  // outputPath: 'assets', //這個可以將打包後的資源放到指定的文件夾下
                },
              },
            ],
            exclude: /node_modules/,
          },
          // {
          //   test: /.html$/,
          //   use: 'html-withimg-loader'
          // },
        ],
      },
      // resolve: {  // 本想用这个代码来实现JS引入assets资源为相对路径,但是一直报错
      //   alias: {
      //     '@': resolve('src')
      //   }
      // },
      optimization: {
        minimizer: [
          // 只有打包环境为production时才能生效
          terserPlugin,
        ],
      },
      plugins: [
        // 數組,放著所有的webpack插件
        new HtmlWebpackPlugin({
          template: './public/index.html',
          filename: 'index.html',
          config: config.template, //html-webpack-plugin 的 config 的妙用4-4
          minify: {
            removeAttributeQuotes: false, //是否刪除屬性的雙引號
            collapseWhitespace: false, //是否折疊空白
          },
          hash: true, //是否加上hash,默認是false
        }),
        new CleanWebpackPlugin(), //清理dist目錄插件,不需要傳參數,它自己可以找到outPath
        // new CleanWebpackPlugin({cleanOnceBeforeBuildPatterns:['**/*','!dll','!dll/**']}) //如果你有需要不刪除dll目錄下的文件的話可以這樣子寫
        new CopyWebpackPlugin({
          patterns: [
            {
              from: 'src/'+ config.template.assetsPath,
              to: config.template.assetsPath,
            },
          ],
        }),
      ],
      devServer: {
        port: '8080', //默認是8080
        quiet: false, //默認不啟動
        inline: true, // 默認開啟inline 模式,如果設置為false, 開啟 iframe模式
        stats: 'errors-only', //終端僅僅打印 error
        overlay: false, //默認不啟用
        clientLogLevel: 'silent', //日誌等級
        compress: true, //是否啟用gzip壓縮
      },
      devtool: 'cheap-module-eval-source-map', //开发环境下使用 打包上线之前要改一下这个哦TODU-LIST
    }
    
    // 在webpack中配置 babel,如果沒有額外的.babelrc配置的話就可以使用這段代碼2
    
    

    .babelrc

    {
      "presets": ["@babel/preset-env"],
      "plugins": [
          [
              "@babel/plugin-transform-runtime",
              {
                  "corejs": 3
              }
          ]
      ]
    }
    
    

    我的package.json

    {
      "name": "webpack_test",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {
        "build": "set NODE_ENV=production&& webpack",
        "dev": "set NODE_ENV=development&& webpack-dev-server --host 10.251.134.102",
        "test": "echo "Error: no test specified" && exit 1"
      },
      "keywords": [],
      "author": "",
      "license": "ISC",
      "devDependencies": {
        "@babel/core": "^7.8.6",
        "@babel/plugin-transform-runtime": "^7.8.3",
        "@babel/preset-env": "^7.8.6",
        "autoprefixer": "^9.7.4",
        "babel-loader": "^8.0.6",
        "clean-webpack-plugin": "^3.0.0",
        "css-loader": "^3.4.2",
        "file-loader": "^5.1.0",
        "html-webpack-plugin": "^3.2.0",
        "less": "^3.11.1",
        "less-loader": "^5.0.0",
        "postcss-loader": "^3.0.0",
        "style-loader": "^1.1.3",
        "terser-webpack-plugin": "^4.2.3",
        "url-loader": "^3.0.0",
        "webpack": "^4.41.6",
        "webpack-cli": "^3.3.11",
        "webpack-dev-server": "^3.10.3"
      },
      "dependencies": {
        "@babel/runtime": "^7.8.4",
        "@babel/runtime-corejs3": "^7.8.4",
        "copy-webpack-plugin": "^6.0.2",
        "html2canvas": "^1.0.0-rc.7",
        "tween": "^0.9.0"
      }
    }
    
    

    接下来我来放几个代码的使用方式吧~~

    // srcindex.js
    import './index.less'
    // 正式版本------------------------
    // import './js/indexV1_1.js' // 初版
    // import './js/indexV1_2.js' // 初版功能增强
    // 测试版本------------------------
    // import './js/indexTest_1.js' // 测试版本1
    import './js/indexTest_2.js' // 测试版本2
    // class Word {
    //   constructor(mydata) {
    //     this.mydata = mydata
    //   }
    //   getMydata() {
    //     return this.mydata
    //   }
    // }
    // const start = new Word('项目已启动')
    console.log('项目已启动')
    
    

    先来看一下less里的图片引用方式

    srcindex.less

    @color: red;
    body {
      background: #020929;
      // div{
      //   color: @color;
      //   transition: all 2s;
      // }
      // background: url('./assets/img/mya.png');
      .panel {
        border: 0;
         400px;
        font-size: 30px;
        line-height: 31px;
        text-indent: 20px;
      }
    }
    

    我们再来看一下js的图片引用方式

    先来看srcjs ool.js

    const isDev = process.env.NODE_ENV.trim() === 'development' 
    const config = require('../../public/config')[isDev ? 'dev' : 'build']
    const staticUrl = config.template.publicStaticPath
    export { staticUrl }
    

    再来看一下srcjsindexV1_2.js

    import { staticUrl } from './tool'
    
    
    var planeTexture = new THREE.TextureLoader().load(
        staticUrl + 'assets/img/equipment/floor.png'
      )
    

    好了,这个就是大概的使用方法了~~ 目前已经试过多次,打包运行什么的没得毛病哦,我觉得还挺好用

    希望路过的大佬指点一下有没有更好的办法~~~

  • 相关阅读:
    Linux任务调度
    用户管理——用户和用户组
    Linux实用指令
    spring模拟ioc
    浅谈log4j-3-不同输出样式
    浅谈log4j-2
    浅谈log4j
    windows下安装kibana
    【PHP】 解决报错:Error: php71w-common conflicts with php-common-5.4.16-43.el7_4.x86_64
    mysql 8.0设置日期为0000-00-00 00:00:00时报错
  • 原文地址:https://www.cnblogs.com/sugartang/p/14609133.html
Copyright © 2011-2022 走看看