Webpack3.X升级到4.X多页面实战和构建优化

栏目: JavaScript · 发布时间: 6年前

内容简介:Webpack4.x出来也有一段时间了,网上已经有很多关于Webpack4.x原理和新特性的介绍,比如零配置等,这边就不重复了。最近将之前基于Webpack3.x写的一个项目预览gif:
Webpack3.X升级到4.X多页面实战和构建优化

Webpack4.x出来也有一段时间了,网上已经有很多关于Webpack4.x原理和新特性的介绍,比如零配置等,这边就不重复了。

最近将之前基于Webpack3.x写的一个 多页面 项目升级到4.x,记录和总结Webpack3.x升级到4.x遇到的问题以及解决方案。

Webpack3.X升级到4.X多页面实战和构建优化

项目预览gif:

Webpack3.X升级到4.X多页面实战和构建优化
在线查看:webpack.czero.cn

区分3.x和4.x不同之外,也对Webpack进行了构建优化,并分别配置了Webpack3.x和Webpack4.x的基础配置文件托管在Github,可以用在项目中,减少配置的时间。

Webpack3.x: github.com/czero1995/w…

Webpack4.x: github.com/czero1995/w…

项目中Webpack实现功能:

  • 多页面入口配置
  • 使用Ejs模板实现组件化功能(共用头部和底部)
  • 提取公共CSS文件
  • 使用HappyPack做多线程打包
  • 引入最新Babel编译,可编译ES7,ES8(装饰圈@等)
  • devServer,保存自动刷新
  • 引入Less处理器
  • 配置TypeScript
  • 每次Build都先删除掉原先Build出来的文件

区分开发环境和生产环境

开发环境: npm run dev
生产环境: npm run build
复制代码

区分开发环境可以提高Webpack打包效率,比如

  • 开发环境中:

    配置调试模式devtool:cheap-source-map

    配置devServer:保存自动刷新

  • 生产环境:

    配置调试模式devtool:inline-source-map

    加载提取CSS组件

    加载PostCss插件(浏览器前缀,提高兼容性)

    添加每次Build时先删除之前Build的文件

    压缩代码

    清空代码注释和空格

    加载PostCss插件

Webpack3.x和Webpack4.x的几个明显的区别和问题

1. 运行webpack要加参数

从4.0开始:运行webpack一定要加参数

-- mode development或者 --mode productio n,

分别对应开发环境和生产环境,否则会报警告:

Webpack3.X升级到4.X多页面实战和构建优化

3.x (package.json)

"scripts": {
    "build": "webpack --optimize-minimize",
    "dev": "webpack-dev-server --config webpack.dev.config.js"
  },
复制代码

4.x (package.json)

"scripts": {
    "build": "webpack --optimize-minimize --mode production",
    "dev": "webpack-dev-server --config webpack.dev.config.js --mode development"
  },
复制代码

2. 移除loaders,必须使用rules

在Webpack3.x中还保留之前版本的loaders,与rules并存都可以使用,在新版中完全移除了loaders,必须使用rules。否则会报错,将module下面的loaders改为rules即可

Webpack3.X升级到4.X多页面实战和构建优化

3. 需要安装webpack-cli

4.x需要安装webpack-cli,不然运行不起来

npm install webpack-cli --save
复制代码
Webpack3.X升级到4.X多页面实战和构建优化

4. TypeScript ts-loader版本太低

在webpack3.x中typescript使用正常,升级到webpack4.x之后就用不了typescript了,因为版本太低 修改typescript版本,我的事5.2.2,在package.json中修改ts-loader版本号,或者删掉,重新执行 npm install ts-loader即可

Webpack3.X升级到4.X多页面实战和构建优化

5. Ejs无法使用

Webpack结合Ejs可以做到组件化开发,共用HTML代码,比如多个页面的头部和底部,用组件引入的方式,方面后面的开发和维护。

3.x中正常使用,4.x会报ejsRenderLoder of undefined,需要修改htmlplugin的配置。 3.x为:

template: 'ejs-render-loader!pages/index.ejs',
复制代码

4.x为

template: 'ejs-loader!pages/index.ejs',
复制代码
Webpack3.X升级到4.X多页面实战和构建优化

5. text-webpack-plugin版本太低,构建失败

Webpack3.X升级到4.X多页面实战和构建优化

在package.json中修改extract-text-webpack-plugin版本号

"extract-text-webpack-plugin": "^v4.0.0-alpha.0",
复制代码

Webpack构建优化

区分开发环境和生产环境

  • 开发环境不需要去压缩代码
  • 指定调试模式devtool模式

压缩代码用ParalleUglifyPlugin代替自带的UglifyJsPlugin插件

自带的js压缩插件是单线程执行的,而webpack-parallel-uglify-plugin可以并行的执行 开发环境不做无意义的操作

很多配置,在开发阶段是不需要去做的,我们可以区分出开发和线上的两套配置,这样在需要上线的时候再全量编译即可,比如代码压缩,目录内容清理,计算文件hash,提取css文件等

babel-loader开启缓存

babel-loader在执行的时候,可能会产生一些运行期间重复的公共文件,造成代码体积大多余,同时也会减慢编译效率

可以加上cacheDirectory参数或使用transform-runtime插件试试

// webpack.config.js
use: [{
    loader: 'babel-loader',
    options: {
        cacheDirectory: true
    }]


// .bablerc
{
    "presets": [
        "env",
        "react"
    ],
    "plugins": ["transform-runtime"]
    
}
复制代码

使用happypack来加速构建

happypack会采用多进程去打包构建
复制代码

优化构建时的搜索路径alias

使用noParse

webpack打包的时候,有时不需要解析某些模块的加载(这些模块并没有依赖,或者并根本没有模块化),我们可以直接加上这个参数,直接跳过这种解析

module:{
noParse: /node_modules\/(jquery.js)
}
复制代码

启用DllPlugin和DllReferencePlugin预编译库文件

这是最复杂也是提升效果最明显的一步,原理是将第三方库文件单独打包一次,以后的编译都不需要在编译打包第三方库

拷贝静态资源文件,引入DllPlugin和DllReferencePlugin来提前构建一些第三方库,来优化Webpack阿宝。

而在生产环境时,就需要将提前构建好的包同步到dist中

对于commonChunkPlugin,webpack每次打包实际还是需要去处理这些第三方库,只是打包完之后,能把第三方库和我们自己的代码分开。 而DllPlugin则是能把第三方代码完全分离开,即每次只打包项目自身的代码。 在 build/ 文件夹下新建 webpack.dll.config.js 文件,复制一下代码:

const path = require("path")
	const webpack = require("webpack")
	
	module.exports = {
	    // 你想要打包的模块的数组
	    entry: {
	        vendor: ['vue/dist/vue.esm.js', 'axios', 'vue-router', 'vuex']
	    },
	    output: {
	        path: path.join(__dirname, '../static/js'), // 打包后文件输出的位置
	        filename: '[name].dll.js',
	        library: '[name]_library'
	    },
	    plugins: [
	        new webpack.DllPlugin({
	            path: path.join(__dirname, '.', '[name]-manifest.json'),
	            name: '[name]_library',
	            context: __dirname
	        }),
	        // 压缩打包的文件
	        new webpack.optimize.UglifyJsPlugin({
	            compress: {
	                warnings: false
	            }
	        })
	    ]
	}
复制代码

build/webpack.dev.config.jsbuild/webpack.prod.config.js 中添加plugins

new webpack.DllReferencePlugin({
	      context: __dirname,
	      manifest: require('./vendor-manifest.json')
	}),
复制代码

根目录下的index.html 下引入预编译的库

<script src="./static/js/vendor.dll.js"></script>
复制代码

package.json/scripts 下中添加dll命令

"dll": "webpack --config ./build/webpack.dll.config.js"
复制代码

运行:

npm run dll
复制代码

然后再

npm run dev或npm run build
复制代码

提取公共代码 使用CommonsChunkplugin提取公共的模块,可以减少文件体积,也有助于浏览器层的文件缓存

npm run dll
npm run dev 或npm run build
复制代码

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Flash ActionScript 3.0从入门到精通

Flash ActionScript 3.0从入门到精通

章精设、胡登涛 / 清华大学出版社 / 2008-10-1 / 69.00元

Flash ActionScript 3.0的出现,不仅从形式上改变了ActionScript,而且从本质上改变了ActionScript,使ActionScript 3.0成为了真正的面向对象编程语言。 本书从最简单的编程知识出发,带领读者走进编程的大门,是一本不可多得的ActionScript 3.0入门书。本书在注重基础的同时,从更高的层次来介绍ActionScript 3.0的面向对......一起来看看 《Flash ActionScript 3.0从入门到精通》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具