'use strict'
//引入node path 中間件 可以獲取到 path 路徑的一些信息
const path = require('path')
//引入utils工具模塊 utils主要用來處理css-loader和vue-style-loader的
const utils = require('./utils')
//引入config下面的index文件 主要是配置一些開發環境和生產環境的配置
const config = require('../config')
//用來解決各種css 文件 sass less stulys 等
const vueLoaderConfig = require('./vue-loader.conf')
// 定義了一個路徑函數 返回當前的目錄的平行目錄下的dir因為有'..'也就是獲取絕對路徑,方便對import時引入地址的方便填寫
function resolve(dir) {
return path.join(__dirname, '..', dir)
}
//eslint 的檢測規則
const createLintingRule = () => ({
//對js和vue 文件進行eslint 檢查
test: /\.(js|vue)$/,
//使用eslint-loader
loader: 'eslint-loader',
//enforce執行的意思 有兩個值 pre post
//pre是在其他規則執行之前執行 post是在其他規則執行之后執行
enforce: 'pre',
//進行檢測的文件目錄包括哪些 調用了路徑函數,
include: [resolve('src'), resolve('test')],
options: {
//使用第三方的插件進行eslint 檢測
formatter: require('eslint-friendly-formatter'),
//是否輸出eslint報錯信息
emitWarning: !config.dev.showEslintErrorsInOverlay
}
})
//webpack的配置,可以理解成是開發環境和正式環境的一些公共配置
module.exports = {
//webpack 解析時根目錄地址如果此文件在跟目錄這句話就不用寫
context: path.resolve(__dirname, '../'),
//項目的入口文件
entry: {
app: './src/main.js'
},
//項目出口文件配置
output: {
//項目buid的出口文件的目錄地址,這里指的是(../dist文件目錄) 引入的是config.build 下面的配置
path: config.build.assetsRoot,
//文件的名字
filename: '[name].js',
//輸出解析文件的目錄,url 相對於 HTML 頁面(生成的html文件中,css和js等靜態文件的url前綴)
publicPath: process.env.NODE_ENV === 'production' ?
config.build.assetsPublicPath : config.dev.assetsPublicPath
},
resolve: {
//指定哪些文件在引用時可以省略后綴名
extensions: ['.js', '.vue', '.json'],
//別名,在引用文件時 使用別名代理真實目錄 后面再在目錄時以別名代替
alias: {
'@': resolve('src'),
'common': resolve('src/common'),
'components': resolve('src/components')
}
},
module: {
//轉換解析規則
//1.test是用來解析所有此后綴名的文件,
//2.loader我們用什么npm什么形式的loader去解析
//3.include是代表我們解析的文件只包含那些東西
//4.options解析文件參數設置 具體看下面的解釋
rules: [
...(config.dev.useEslint ? [createLintingRule()] : []),
{
test: /\.vue$/,
loader: 'vue-loader',
//對vue的css進行解析
options: vueLoaderConfig
},
{
//對js文件使用babel-loader進行解析 主要是解析es6
test: /\.js$/,
loader: 'babel-loader',
include: [resolve('src'), resolve('test')]
},
{
//對圖片使用url-loader解析 這個插件的作用是將一個足夠小的文件生成一個64位的DataURL
//當limit小於10000進行將圖片生成base64
//name 指的是引入的utils里面的一個方法 將name ,7位哈希 .ext 代表后綴名
//傳入方法 返回結果是 /static/img/[name].[hash:7].[ext]
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: utils.assetsPath('img/[name].[hash:7].[ext]')
}
},
{
//對一些音頻文件進行解析
test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: utils.assetsPath('media/[name].[hash:7].[ext]')
}
},
{
//對字體文件進行解析
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
}
}
]
},
node: {
// 是否 polyfill 或 mock
// prevent webpack from injecting useless setImmediate polyfill because Vue
// 源包含它(雖然僅在本地使用)
setImmediate: false,
// 預防webpack從注入模擬節點到node原生模塊
// that does not make sense for the client 這對客戶端沒有影響
dgram: 'empty',
fs: 'empty',
net: 'empty',
tls: 'empty',
child_process: 'empty'
}
}