-
? 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前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
其实前端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
这里再分享一个复习的路线:(以下体系的复习资料是我从各路大佬收集整理好的)
《前端开发四大模块核心知识笔记》
最后,说个题外话,我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在IT学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。
…(img-xl9VkcVG-1712046245490)]
[外链图片转存中…(img-OaS3ZDOs-1712046245490)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-DCOJulRZ-1712046245491)]
其实前端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
这里再分享一个复习的路线:(以下体系的复习资料是我从各路大佬收集整理好的)
《前端开发四大模块核心知识笔记》
最后,说个题外话,我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在IT学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。