详解 vue-cli 的打包配置文件代码(带注释)

? config.build.assetsPublicPath
config.dev.assetsPublicPath

},

resolve: {

// 自动补全的扩展名

extensions: [‘.js’, ‘.vue’, ‘.json’],

// 默认路径代理,即起别名,例如 import Vue from ‘vue’,会自动到 'vue/dist/vue.common.js’中寻找

alias: {

‘@’: resolve(‘src’),

‘common’: resolve(‘src/common’),

‘components’: resolve(‘src/components’),

‘base’: resolve(‘src/base’),

‘api’: resolve(‘src/api’)

}

},

module: {

rules: [

// 需要处理的文件及使用的 loader

{

test: /.(js|vue)$/,

loader: ‘eslint-loader’,

enforce: ‘pre’,

include: [resolve(‘src’), resolve(‘test’)],

options: {

// eslint 代码检查配置工具

formatter: require(‘eslint-friendly-formatter’)

}

},

{

test: /.vue$/,

loader: ‘vue-loader’,

options: vueLoaderConfig

},

{

test: /.js$/,

loader: ‘babel-loader’,

include: [resolve(‘src’), resolve(‘test’)]

},

{

test: /.(png|jpe?g|gif|svg)(?.*)?$/,

loader: ‘url-loader’,

options: {

limit: 10000,

name: utils.assetsPath(‘img/[name].[hash:7].[ext]’)

}

},

{

test: /.(woff2?|eot|ttf|otf)(?.*)?$/,

loader: ‘url-loader’,

options: {

limit: 10000,

name: utils.assetsPath(‘fonts/[name].[hash:7].[ext]’)

}

}

]

}

}

3、build/webpack.dev.conf.js

// 使用一些小工具

var utils = require(‘./utils’)

var webpack = require(‘webpack’)

// 同样的使用了 config/index.js 的预设配置

var config = require(‘…/config’)

// 使用 webpack 配置合并插件

var merge = require(‘webpack-merge’)

// 加载 webpack.base.conf

var baseWebpackConfig = require(‘./webpack.base.conf’)

// 使用 html-webpack-plugin 插件,这个插件可以帮我们自动生成 html 并且注入到 .html 文件中

var HtmlWebpackPlugin = require(‘html-webpack-plugin’)

// 一个友好的错误提示插件

var FriendlyErrorsPlugin = require(‘friendly-errors-webpack-plugin’)

// 将 Hol-reload 相对路径添加到 webpack.base.conf 的 对应 entry 前

Object.keys(baseWebpackConfig.entry).forEach(function (name) {

baseWebpackConfig.entry[name] = [‘./build/dev-client’].concat(baseWebpackConfig.entry[name])

})

// 将我们 webpack.dev.conf.js 的配置和 webpack.base.conf.js 的配置合并

module.exports = merge(baseWebpackConfig, {

module: {

// 使用 styleLoaders

rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap })

},

// 使用 #eval-source-map 模式作为开发工具,此配置可参考 DDFE 往期文章详细了解

devtool: ‘#cheap-module-eval-source-map’,

plugins: [

// definePlugin 接收字符串插入到代码当中, 所以你需要的话可以写上 JS 的字符串

new webpack.DefinePlugin({

‘process.env’: config.dev.env

}),

// definePlugin 接收字符串插入到代码当中, 所以你需要的话可以写上 JS 的字符串

// HotModule 插件在页面进行变更的时候只会重回对应的页面模块,不会重绘整个 html 文件

new webpack.HotModuleReplacementPlugin(),

// 遇到报错,跳过还行,并提示错误信息

new webpack.NoEmitOnErrorsPlugin(),

// 将 index.html 作为入口,注入 html 代码后生成 index.html文件

new HtmlWebpackPlugin({

filename: ‘index.html’,

template: ‘index.html’,

inject: true

}),

// 使用这个插件,更好的输出错误信息

new FriendlyErrorsPlugin()

]

})

4、build/webpack.prod.conf.js

var path = require(‘path’)

var utils = require(‘./utils’)

var webpack = require(‘webpack’)

var config = require(‘…/config’)

// 加载 webpack 配置合并工具

var merge = require(‘webpack-merge’)

// 加载 webpack.base.conf.js文件

var baseWebpackConfig = require(‘./webpack.base.conf’)

var CopyWebpackPlugin = require(‘copy-webpack-plugin’)

// 一个可以插入 html 并且创建新的 .html 文件的插件

var HtmlWebpackPlugin = require(‘html-webpack-plugin’)

// 一个 webpack 扩展,可以提取一些代码并且将它们和文件分离开

// 如果我们想将 webpack 打包成一个文件 css js 分离开,那我们需要这个插件

var ExtractTextPlugin = require(‘extract-text-webpack-plugin’)

var OptimizeCSSPlugin = require(‘optimize-css-assets-webpack-plugin’)

var env = config.build.env

// 合并 webpack.base.conf.js

var webpackConfig = merge(baseWebpackConfig, {

module: {

// 使用的 loader

rules: utils.styleLoaders({

sourceMap: config.build.productionSourceMap,

extract: true

})

},

// 是否使用 #source-map 开发工具,更多信息可以查看 DDFE 往期文章

devtool: config.build.productionSourceMap ? ‘#source-map’ : false,

output: {

// 编译输出目录

path: config.build.assetsRoot,

// 编译输出文件名

// 我们可以在 hash 后加 :6 决定使用几位 hash 值

filename: utils.assetsPath(‘js/[name].[chunkhash].js’),

// 没有指定输出名的文件输出的文件名

chunkFilename: utils.assetsPath(‘js/[id].[chunkhash].js’)

},

plugins: [

// definePlugin 接收字符串插入到代码当中, 所以你需要的话可以写上 JS 的字符串

new webpack.DefinePlugin({

‘process.env’: env

}),

// 压缩 js (同样可以压缩 css)

new webpack.optimize.UglifyJsPlugin({

compress: {

warnings: false

},

sourceMap: true

}),

// 将 css 文件分离出来

new ExtractTextPlugin({

filename: utils.assetsPath(‘css/[name].[contenthash].css’)

}),

// Compress extracted CSS. We are using this plugin so that possible

// duplicated CSS from different components can be deduped.

new OptimizeCSSPlugin({

cssProcessorOptions: {

safe: true

}

}),

// 输入输出的 .html 文件

new HtmlWebpackPlugin({

filename: config.build.index,

template: ‘index.html’,

// 是否注入 html

inject: true,

// 压缩的方式

minify: {

removeComments: true,

collapseWhitespace: true,

removeAttributeQuotes: true

},

chunksSortMode: ‘dependency’

}),

// 没有指定输出文件名的文件输出的静态文件名

new webpack.optimize.CommonsChunkPlugin({

name: ‘vendor’,

minChunks: function (module, count) {

// any required modules inside node_modules are extracted to vendor

return (

module.resource &&

/.js$/.test(module.resource) &&

module.resource.indexOf(

path.join(__dirname, ‘…/node_modules’)

) === 0

)

}

}),

// 没有指定输出文件名的文件输出的静态文件名

new webpack.optimize.CommonsChunkPlugin({

name: ‘manifest’,

chunks: [‘vendor’]

}),

// copy custom static assets

new CopyWebpackPlugin([

{

from: path.resolve(__dirname, ‘…/static’),

to: config.build.assetsSubDirectory,

ignore: [‘.*’]

}

])

]

})

// 开启 gzip 的情况下使用下方的配置

if (config.build.productionGzip) {

// 加载 compression-webpack-plugin 插件

var CompressionWebpackPlugin = require(‘compression-webpack-plugin’)

webpackConfig.plugins.push(

// 使用 compression-webpack-plugin 插件进行压缩

new CompressionWebpackPlugin({

asset: ‘[path].gz[query]’,

algorithm: ‘gzip’,

test: new RegExp(

‘\.(’ +

config.build.productionGzipExtensions.join(‘|’) +

‘)$’

),

threshold: 10240,

minRatio: 0.8

})

)

}

if (config.build.bundleAnalyzerReport) {

// 懒加载插件

var BundleAnalyzerPlugin = require(‘webpack-bundle-analyzer’).BundleAnalyzerPlugin

webpackConfig.plugins.push(new BundleAnalyzerPlugin())

}

module.exports = webpackConfig

5、build/build.js

// 检查 Node 和 npm 版本

require(‘./check-versions’)()

// 当node无法判断是本地还是线上时,这里默认写上线上

process.env.NODE_ENV = ‘production’

// 一个很好看的 loading 插件

var ora = require(‘ora’)

var rm = require(‘rimraf’)

var path = require(‘path’)

var chalk = require(‘chalk’)

var webpack = require(‘webpack’)

var config = require(‘…/config’)

// 加载 webpack.prod.conf文件

var webpackConfig = require(‘./webpack.prod.conf’)

// 使用 ora 打印出 loading + log

var spinner = ora(‘building for production…’)

// 开始 loading 动画

spinner.start()

// 删除打包后的文件夹,重新生成打包后的文件

rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {

if (err) throw err

// 开始 webpack 的编译

webpack(webpackConfig, function (err, stats) {

// 编译成功的回调函数

spinner.stop()

if (err) throw err

process.stdout.write(stats.toString({

colors: true,

modules: false,

children: false,

chunks: false,

chunkModules: false

}) + ‘\n\n’)

console.log(chalk.cyan(’ Build complete.\n’))

console.log(chalk.yellow(

’ Tip: built files are meant to be served over an HTTP server.\n’ +

’ Opening index.html over file:// won’t work.\n’

))

})

})

6、config/index.js

// see http://vuejs-templates.github.io/webpack for documentation.

var path = require(‘path’)

module.exports = {

// production 环境

build: {

// 使用 config/prod.env.js 中定义的编译环境

env: require(‘./prod.env’),

port: 9000,

index: path.resolve(__dirname, ‘…/dist/index.html’),

// 编译输出的静态资源根路径

assetsRoot: path.resolve(__dirname, ‘…/dist’),

// 编译输出的二级目录

assetsSubDirectory: ‘static’,

// 编译发布上线路径的根目录,可配置为资源服务器域名或 CDN 域名

assetsPublicPath: ‘’,

// 是否开启 cssSourceMap

productionSourceMap: true,

// 是否开启 gzip

productionGzip: false,

// 需要使用 gzip 压缩的文件扩展名

productionGzipExtensions: [‘js’, ‘css’],

// 插件叫做bundleAnalyzerReport,上面有几行注释,讲的是只要在打包的时候输入npm run build --report,就可以在打包的同时查看每个打包生成的js,里面的库的构成情况,方便我们进行相关的删减,比如有的库太大了,是否可以自己实现,有的库是否有必要,可否删除之类

bundleAnalyzerReport: process.env.npm_config_report

},

// 使用 config/dev.env.js 中定义的编译环境

dev: {

env: require(‘./dev.env’),

// 运行测试页面的端口

port: 8080,

// 是否自动打开浏览器

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
img

其实前端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

这里再分享一个复习的路线:(以下体系的复习资料是我从各路大佬收集整理好的)

《前端开发四大模块核心知识笔记》

最后,说个题外话,我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在IT学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。

…(img-xl9VkcVG-1712046245490)]
[外链图片转存中…(img-OaS3ZDOs-1712046245490)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-DCOJulRZ-1712046245491)]

其实前端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

这里再分享一个复习的路线:(以下体系的复习资料是我从各路大佬收集整理好的)

《前端开发四大模块核心知识笔记》

最后,说个题外话,我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在IT学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值