zoukankan      html  css  js  c++  java
  • build 文件夹中的 webpack.base.conf.js

      1 // webpack.base.conf.js 基础配置
      2 'use strict'
      3 const path = require('path') // path模块是路径设置
      4 const webpack = require('webpack')
      5 const utils = require('./utils') // 主要处理css-loader
      6 const config = require('../config') // 引入config目录下的index.js配置文件,主要定义一些开发和生产
      7 const vueLoaderConfig = require('./vue-loader.conf') //解决css文件
      8 const MiniCssExtractPlugin = require('mini-css-extract-plugin') // 从css文件中提取css代码到单独的文件中,对css代码进行代码压缩等
      9 const VueLoaderPlugin = require('vue-loader/lib/plugin')
     10 const threadLoader = require('thread-loader') // 多进程打包
     11 const HardSourceWebpackPlugin = require('hard-source-webpack-plugin') // 缓存的方式 webpack5.0会把hard-source-webpack-plugin内置成一个配置。
     12 const prodEnv = require('../config/prod.env')
     13 
     14 const WorkerPool = {
     15   workers: 2,
     16   workerParallelJobs: 50,
     17   poolTimeout: 2000,
     18   poolRespawn: false,
     19   name: "my-pool"
     20 };
     21 
     22 threadLoader.warmup(WorkerPool, ['vue-loader', 'babel-loader']);
     23 
     24 function resolve(dir) {
     25   return path.join(__dirname, '..', dir)
     26 }
     27 
     28 // 加载 Eslint ,是否开启 取决于 config 目录下的 index.js 中的 useEslint
     29 const createLintingRule = () => ({
     30   test: /.(js|vue)$/,
     31   loader: 'eslint-loader',
     32   enforce: 'pre',
     33   include: [resolve('src'), resolve('test')],
     34   options: {
     35     formatter: require('eslint-friendly-formatter'),
     36     emitWarning: !config.dev.showEslintErrorsInOverlay
     37   }
     38 })
     39 
     40 
     41 // webpack 四个核心概念:入口(entry)、输出(output)、loader、插件(plugins)
     42 
     43 
     44 // 将这个文件暴露出去
     45 module.exports = {
     46   context: path.resolve(__dirname, '../'),
     47 
     48   /**
     49    *  入口(entry)
     50    *  入口起点(entry point)指示 webpack 应该使用哪个模块,来作为构建其内部依赖图的开始。entry的值可以是一个字符串也可以是一个数组(会将entry定义的数组文件内容打包到output中定义的文件中),也*  可以是一个json对象(使用于多页面的编译),默认值为 ./src
     51    */
     52   entry: {
     53     app: './src/main.js'
     54   },
     55 
     56   /**
     57    *  插件(plugins)
     58    */
     59   plugins: [
     60     new VueLoaderPlugin(),
     61     new HardSourceWebpackPlugin({
     62       // 缓存位置
     63       cacheDirectory: process.env.NODE_ENV === 'development' || !prodEnv.VERSION_CONTROL ? '../node_modules/.cache/hard-source/[confighash]' : '../../node_modules/.cache/hard-source/[confighash]',
     64 
     65       // 记录路径
     66       recordsPath: process.env.NODE_ENV === 'development' || !prodEnv.VERSION_CONTROL ? '../node_modules/.cache/hard-source/[confighash]/records.json' : '../../node_modules/.cache/hard-source/[confighash]/records.json',
     67       configHash: function (webpackConfig) {
     68         // node-object-hash on npm can be used to build this.
     69         return require('node-object-hash')({
     70           sort: false
     71         }).hash(webpackConfig);
     72       },
     73 
     74       // 当加载器,插件,其他构建时脚本或其他动态依赖项发生更改时,hard-source需要替换缓存以确保输
     75       // 出正确。environmentHash被用来确定这一点。如果散列与先前的构建不同,则将使用新的缓存
     76       environmentHash: {
     77         root: process.cwd(),
     78         directories: [],
     79         files: ['package-lock.json', 'yarn.lock'],
     80       }
     81     }),
     82     ...(function () {
     83       let max = 2
     84       let res = []
     85       for (let i = 0; i < max; i++) {
     86         res.push(new webpack.DllReferencePlugin({
     87           context: path.resolve(__dirname, '../'),
     88           manifest: require(resolve(`./dllManifest/xuAdmin${i}-manifest.json`))
     89         }))
     90       }
     91       return res
     92     })()
     93   ],
     94 
     95   /** 
     96    *  输出(output)
     97    *  output 属性告诉 webpack 在哪里输出它所创建的 bundles,以及如何命名这些文件,默认值为 ./dist。
     98    */
     99   output: {
    100     path: config.build.assetsRoot, // 路径是config目录下的index.js中的build配置中的assetsRoot,也就是dist目录
    101     filename: '[name].js', // 文件名称这里使用默认的name也就是main
    102 
    103     // 上线地址,也就是真正的文件引用路径,如果是production生产环境,其实这里都是 '/'
    104     publicPath: process.env.NODE_ENV === 'production' ?
    105       config.build.assetsPublicPath : config.dev.assetsPublicPath
    106   },
    107 
    108 
    109   /**
    110    *  解析(resolve) 配置模块如何解析
    111    */
    112   resolve: {
    113     // resolve.extensions 自动解析确定的扩展。默认值为:extensions: [".js", ".json"]
    114     extensions: ['.js', '.vue', '.json'],
    115 
    116     // resolve.alias 创建 import 或 require 的别名,来确保模块引入变得更简单。
    117     alias: {
    118       'vue$': 'vue/dist/vue.esm.js', //后面的$符号指精确匹配,也就是说只能使用 import vuejs from "vue" 这样的方式导入vue.esm.js文件,不能在后面跟上 vue/vue.js
    119       '@': resolve('src'), //  // resolve('src') 其实在这里就是项目根目录中的src目录,使用 import somejs from "@/some.js" 就可以导入指定文件
    120     }
    121   },
    122 
    123   /**
    124    *  loader
    125    *  loader 让 webpack 能够去处理那些非 JavaScript 文件(webpack 自身只理解 JavaScript)
    126    *  对一个单独的 module 对象定义了 rules 属性,里面包含两个必须属性:test 和 use 
    127    *  这告诉 webpack 编译器(compiler) 如下信息:
    128    *  “嘿,webpack 编译器,当你碰到「在 require()/import 语句中被解析为 '.vue' 的路径」时,在你对它打包之前,先使用 vue-loader 转换一下。
    129    */
    130   module: {
    131     rules: [{
    132         test: /.vue$/,
    133         use: [{
    134             loader: 'thread-loader',
    135             options: WorkerPool
    136           },
    137           'cache-loader',
    138           {
    139             loader: 'vue-loader',
    140             options: vueLoaderConfig
    141           }
    142         ]
    143       },
    144       {
    145         test: /.js$/,
    146         use: [{
    147             loader: 'thread-loader',
    148             options: WorkerPool
    149           },
    150           'cache-loader',
    151           {
    152             loader: 'babel-loader',
    153             options: {
    154               cacheDirectory: true
    155             }
    156           }
    157         ],
    158         include: [resolve('src'), resolve('test')],
    159         exclude: /(node_modules)/
    160       },
    161       {
    162         test: /.(png|jpe?g|gif|svg)(?.*)?$/,
    163         loader: 'url-loader',
    164         options: {
    165           limit: 10000,
    166           esModule: false,
    167           name: utils.assetsPath('img/[name].[hash:7].[ext]')
    168         },
    169         exclude: [resolve('src/icons')],
    170       },
    171       {
    172         test: /.(mp4|webm|ogg|mp3|wav|flac|aac)(?.*)?$/,
    173         loader: 'url-loader',
    174         options: {
    175           limit: 10000,
    176           esModule: false,
    177           name: utils.assetsPath('media/[name].[hash:7].[ext]')
    178         }
    179       },
    180       {
    181         test: /.(woff2?|eot|ttf|otf)(?.*)?$/,
    182         loader: 'url-loader',
    183         options: {
    184           limit: 10000,
    185           esModule: false,
    186           name: utils.assetsPath('fonts/[name].[hash:7].[ext]'),
    187           publicPath: "../../"
    188         }
    189       },
    190       {
    191         test: /.sass$/,
    192         use: [process.env.NODE_ENV === 'production' ? MiniCssExtractPlugin.loader : 'style-loader', {
    193           loader: 'css-loader',
    194           options: {
    195             sourceMap: true
    196           },
    197         }, "sass-loader"],
    198         include: [resolve('src'), resolve('test')],
    199         exclude: /(node_modules)/,
    200       }
    201     ]
    202   },
    203 
    204   node: {
    205     // prevent webpack from injecting useless setImmediate polyfill because Vue
    206     // source contains it (although only uses it if it's native).
    207     setImmediate: false,
    208     // prevent webpack from injecting mocks to Node native modules
    209     // that does not make sense for the client
    210     dgram: 'empty',
    211     fs: 'empty',
    212     net: 'empty',
    213     tls: 'empty',
    214     child_process: 'empty'
    215   }
    216 }
  • 相关阅读:
    Windows内核对象
    FreeWriting_1
    FreeWriting_2
    【整理】技术文章集锦
    【转】英语吵架一百句
    像 IDE 一样使用 vim
    统治世界的十大算法
    AnimationSet动画集合类的使用
    帮你解答adb是什么,adb有什么用
    SharedPreferences的简单使用
  • 原文地址:https://www.cnblogs.com/zhuyujie/p/14074628.html
Copyright © 2011-2022 走看看