webpack里脚手架优化的实现方法

这次给大家带来webpack脚手架优化的实现方法,webpack里脚手架优化的注意事项有哪些,下面就是实战案例,一起来看一下。

在之前的文章中了解了webpack v4的特性,现在将知识用于实践,对之前写的一个react脚手架进行打包性能的优化。

优化类目

样式分离

第三方资源分离

区分开发环境

热更新

提取公共代码

1. CSS分离

npm install extract-text-webpack-plugin -D

登录后复制

webpack.config.js

将css、less、sass文件单独从打包文件中分离

+ let cssExtract = new ExtractTextWebpackPlugin({+ filename: 'css.css',+ allChunks: true+ });+ let sassExtract = new ExtractTextWebpackPlugin('sass.css')+ let lessExtract = new ExtractTextWebpackPlugin('less.css')

登录后复制

在webpack.config.js中单独添加规则,

test:匹配处理文件的扩展名的正则表达式

include/exclude手动指定必须处理的文件夹或屏蔽不需要处理的文件夹

{ test: /.css$/, use: cssExtract.extract({ fallback: "style-loader", use: ['css-loader?minimize','postcss-loader'], publicPath: "/dist" }), include:path.join(dirname,'./src'), exclude:/node_modules/},{ test: /.scss$/, use: sassExtract.extract({ fallback: "style-loader", use: ["css-loader?minimize","sass-loader"], publicPath: "/dist" }), include:path.join(dirname,'./src'), exclude:/node_modules/},{ test: /.less$/, loader: lessExtract.extract({ use: ["css-loader?minimize", "less-loader"] }), include:path.join(dirname,'./src'), exclude:/node_modules/},

登录后复制

然后运行webpack命令时报错

compilation.mainTemplate.applyPluginsWaterfall is not a function

Use Chunks.groupsIterable and filter by instanceof Entrypoint instead

研究得出结论:webpack升级到v4然而响应的插件没有升级的原故。

解决方法:安装指定版本的依赖

"html-webpack-plugin": "^3.0.4""extract-text-webpack-plugin": "^4.0.0-beta.0"

登录后复制

resolve

指定extension之后可以不用在require或是import的时候加文件扩展名,会依次尝试添加扩展名进行匹配

resolve: { //引入模块的时候,可以不用扩展名 extensions: [".js", ".less", ".json"], alias: {//别名 "bootstrap": "bootstrap/dist/css/bootstrap.css" }}

登录后复制

监听文件修改

webpack模式下使用,webpack-dev-server模式不用,可以将watch改为false

watchOptions: { ignored: /node_modules/, aggregateTimeout: 300, //监听到变化发生后等300ms再去执行动作,防止文件更新太快导致编译频率太高 poll: 1000 //通过不停的询问文件是否改变来判断文件是否发生变化,默认每秒询问1000次}

登录后复制

提取公共代码

optimization: { splitChunks: { cacheGroups: { commons: {  chunks: "initial",  minChunks: 2,  maxInitialRequests: 5, // The default limit is too small to showcase the effect  minSize: 0 // This is example is too small to create commons chunks }, vendor: {  test: /node_modules/,  chunks: "initial",  name: "vendor",  priority: 10,  enforce: true } } } }

登录后复制

分离react react-dom ant公共代码

方法一:externals

在页面上引入第三方资源库,然后使用externals防止将某些 import 的包(package)打包到 bundle 中,而是在运行时(runtime)再去从外部获取这些扩展依赖(external dependencies)。

externals: { 'react': 'React', 'react-dom': 'ReactDOM', // 提出ant design的公共资源, }

登录后复制

方法二:DLL

DLL在上篇文章中写过,但是打包后一直出现

webpack里脚手架优化的实现方法

后来才发现是页面上没有引入资源。。。。(我一直以为会webpack自动生成在页面上….)

在index.html文件中引入


登录后复制

分离成功!上代码

webpack.base.js

var path = require('path');var webpack = require('webpack');var ExtractTextWebpackPlugin = require("extract-text-webpack-plugin");const HtmlWebpackPlugin = require("html-webpack-plugin");const CleanWebpackPlugin = require('clean-webpack-plugin');const CopyWebpackPlugin = require('copy-webpack-plugin')let cssExtract = new ExtractTextWebpackPlugin({ filename: 'css.css', allChunks: true});let sassExtract = new ExtractTextWebpackPlugin('sass.css')let lessExtract = new ExtractTextWebpackPlugin('less.css')module.exports = { entry:'./src/index.js', output: { path: path.resolve(dirname, './dist'), filename: 'bundle.[hash:8].js', publicPath: '' }, resolve: { //引入模块的时候,可以不用扩展名 extensions: [".js", ".less", ".json"], alias: {//别名 "bootstrap": "bootstrap/dist/css/bootstrap.css" }, modules: [path.resolve(dirname, 'node_modules')] },/* externals: { 'react': 'React', 'react-dom': 'ReactDOM', // 提出ant design的公共资源 //'antd': 'antd', },*/ devtool: 'source-map', devServer: { contentBase:path.resolve(dirname,'dist'), publicPath: '/', port: 8080, hot:true, compress:true, historyApiFallback: true, inline: true }, watch: false, //只有在开启监听模式时,watchOptions才有意义 watchOptions: { ignored: /node_modules/, aggregateTimeout: 300, //监听到变化发生后等300ms再去执行动作,防止文件更新太快导致编译频率太高 poll: 1000 //通过不停的询问文件是否改变来判断文件是否发生变化,默认每秒询问1000次 }, optimization: { splitChunks: { cacheGroups: { commons: {  chunks: "initial",  minChunks: 2,  maxInitialRequests: 5, // The default limit is too small to showcase the effect  minSize: 0 // This is example is too small to create commons chunks }, vendor: {  test: /node_modules/,  chunks: "initial",  name: "vendor",  priority: 10,  enforce: true } } } }, module: { rules:[ { test: /.js$/, use: {  loader:'babel-loader',  options: {  presets: ['env','es2015', 'react'],  } }, include:path.join(dirname,'./src'), exclude:/node_modules/ }, { test: /.css$/, use: cssExtract.extract({  fallback: "style-loader",  use: ['css-loader?minimize','postcss-loader'],  publicPath: "/dist" }), include:path.join(dirname,'./src'), exclude:/node_modules/ }, { test: /.scss$/, use: sassExtract.extract({  fallback: "style-loader",  use: ["css-loader?minimize","sass-loader"],  publicPath: "/dist" }), include:path.join(dirname,'./src'), exclude:/node_modules/ }, { test: /.less$/, loader: lessExtract.extract({  use: ["css-loader?minimize", "less-loader"] }), include:path.join(dirname,'./src'), exclude:/node_modules/ }, { test: /.(html|htm)/, use: 'html-withimg-loader' }, { test: /.(png|jpg|gif|svg|bmp|eot|woff|woff2|ttf)/, use: {  loader:'url-loader',  options:{  limit: 5 * 1024,  //指定拷贝文件的输出目录  outputPath: 'images/'  } } } ] }, plugins: [ //定义环境变量 new webpack.DefinePlugin({ development: JSON.stringify(process.env.NODE_ENV) }), new CleanWebpackPlugin(['dist']), cssExtract, lessExtract, sassExtract, new HtmlWebpackPlugin({ title: 'React Biolerplate by YuanYuan', template: './src/index.html', filename: `index.html`, hash: true }), new webpack.DllReferencePlugin({ manifest: path.join(dirname, 'vendor', 'react.manifest.json') }), new CopyWebpackPlugin([{ from: path.join(dirname,'vendor'),//静态资源目录源地址 to:'./vendor' //目标地址,相对于output的path目录 }]),/* new webpack.optimize.CommonsChunkPlugin({ name: 'common' // 指定公共 bundle 的名称。 + })*/ new webpack.HotModuleReplacementPlugin(), // 热替换插件 new webpack.NamedModulesPlugin() // 执行热替换时打印模块名字 ]};

登录后复制

webpack.config.js

const path = require('path');const webpack = require('webpack');const merge = require('webpack-merge');//用来合并配置文件const base = require('./webpack.base');let other = '';//console.log(process.env.NODE_ENV )if (process.env.NODE_ENV == 'development') { other = require('./webpack.dev.config');} else { other = require('./webpack.prod.config');}//console.log(merge(base, other));module.exports = merge(base, other);webpack.prod.config.jsconst path = require('path');const webpack = require('webpack');const UglifyJSPlugin = require('uglifyjs-webpack-plugin')module.exports = { output: { filename: 'bundle.min.js', }, plugins: [ new UglifyJSPlugin({sourceMap: true}) ]}

登录后复制

原脚手架地址

webpack里脚手架优化的实现方法

优化后手架地址

webpack里脚手架优化的实现方法

打包速度优化,打包文件细化,改造成功~

相信看了本文案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

推荐阅读:

Vue项目应该怎么分环境打包

在React里使用Vuex的具体步骤

以上就是webpack里脚手架优化的实现方法的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2774573.html

(0)
上一篇 2025年3月8日 14:08:37
下一篇 2025年3月8日 14:08:45

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • webpack的4.0打包优化如何实现

    这次给大家带来webpack的4.0打包优化如何实现,实现webpack 4.0打包优化的注意事项有哪些,下面就是实战案例,一起来看一下。 本文介绍了webpack4.0打包优化策略整理小结,分享给大家,具体如下: webapck4 新特性…

    2025年3月8日 编程技术
    200
  • webpack的移动端自动化构建rem方法详解

    这次给大家带来webpack的移动端自动化构建rem方法详解,webpack移动端自动化构建rem的注意事项有哪些,下面就是实战案例,一起来看一下。 1 照着老的视频教程去弄,发现node npm webpack px2rem的各种插件版本…

    编程技术 2025年3月8日
    200
  • webpack+vuex怎么实现跨域请求数据

    这次给大家带来webpack+vuex怎么实现跨域请求数据,webpack+vuex实现跨域请求数据的注意事项有哪些,下面就是实战案例,一起来看一下。 使用vue-li 构建 webpack项目,修改bulid/config/index.j…

    编程技术 2025年3月8日
    200
  • CDN加速react webpack打包文件过程

    这次给大家带来cdn加速react webpack打包文件过程,cdn加速react webpack打包文件过程的注意事项有哪些,下面就是实战案例,一起来看一下。 此文不介绍webpack基本配置,如果对基本配置有疑问请查阅官方文档。 1、…

    编程技术 2025年3月8日
    200
  • 非常好用的扩展Web表单JS插件总结

    这次给大家带来非常好用的扩展Web表单JS插件总结,使用扩展Web表单JS插件的注意事项有哪些,下面就是实战案例,一起来看一下。 在网站建设中,你可以使用java开发大量酷炫的特效放到你网站上,但我们知道,互联网上也有很多开源的js库和插件…

    编程技术 2025年3月8日
    200
  • Webpack怎么优化配置文件

    这次给大家带来Webpack怎么优化配置文件,Webpack优化配置文件的注意事项有哪些,下面就是实战案例,一起来看一下。 Webpack 启动后会从配置的 Entry 出发,解析出文件中的导入语句,再递归的解析。 在遇到导入语句时 Web…

    编程技术 2025年3月8日
    200
  • Webpack如何构建Electron应用

    这次给大家带来Webpack如何构建Electron应用,Webpack构建Electron应用的注意事项有哪些,下面就是实战案例,一起来看一下。 Electron 可以让你使用开发 Web 的技术去开发跨平台的桌面端应用,由 Github…

    编程技术 2025年3月8日
    200
  • vue-cli+webpack怎样搭建vue开发环境

    这次给大家带来vue-cli+webpack怎样搭建vue开发环境,vue-cli+webpack搭建vue开发环境的注意事项有哪些,下面就是实战案例,一起来看一下。 在这里我们需要首先下载node,因为我们要用到npm包下载,是基于nod…

    编程技术 2025年3月8日
    200
  • vue-cli操作Webpack环境配置

    这次给大家带来vue-cli操作Webpack环境配置,vue-cli操作Webpack环境配置的注意事项有哪些,下面就是实战案例,一起来看一下。 Vue之所以现在如此之火热,一部分也得益于有官方的脚手架生成工具Vue-cli,大大简化了初…

    编程技术 2025年3月8日
    200
  • vue2-webpack2的框架怎么搭建

    这次给大家带来vue2-webpack2的框架怎么搭建,vue2-webpack2框架搭建的注意事项有哪些,下面就是实战案例,一起来看一下。 react、vue、angular代表了3种前端工程化的思想,学习三大框架主要是理解它们的核心概念…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论