最近遇到了原有jquery的非前后端分离项目,要改为前后端分离项目,并且引入微前端架构对新增功能进行支持。
本文章将介绍如何将jquery项目进行前后端拆分,如何使用webpack进行打包。
特别说明:
因为我们页面量很大,工期紧,并没有按照标准的多页面打包方式进行打包。我们还是只有一个入口,入口中引入了公共的css,js等。其他的js文件依然以script标签的形式引入。 缺点是每个静态资源就是一次http请求,加载慢。优点:改动量较小。
当然,你也可以使用标准的多页配置,为每个html配置一个入口js文件。
一、前后端代码拆分
1. 初始化npm,安装webpack
1.1 执行npm init
按照提示初始化package.json
1.2 初始化成功之后可以看到目录下多了package.json
1.3 执行
npm install webpack webpack-cli webpack-dev-server -D
安装webpack全家桶,安装成功之后可以看到多了node_modules文件夹,package.json中也有了我们刚刚安装的依赖。![](https://img.haomeiwen.com/i8400233/db27750fda8e7db8.png)
1.4 jquery项目可以安装jquery依赖,无需每个html单独引入jquery。这里版本号可以根据实际需要修改。
执行
npm install jquery@3.5.0
2. 将jquery代码拆分出来,建议将代码按照自己的代码规范进行拆分。
这里以vue项目结构举例。
2.1 在项目根路径下创建public和src文件夹,并创建js,css,html存放的文件夹,main.js以及index.html入口文件。public文件夹可以放置项目中引入的一些第三方插件。
![](https://img.haomeiwen.com/i8400233/f5c7be58d5532312.png)
2.2 可以将项目中html代码放到views下,将js静态资源放到static下,将css等静态资源放到assets下。我这里建了一个简单的html文件,进行举例。
![](https://img.haomeiwen.com/i8400233/9a23a7fd7fa52b1f.png)
2.3 编写入口文件
jquery项目添加路由,可以参照另一篇文章。
![](https://img.haomeiwen.com/i8400233/ff7fdd42b6f8f1a4.png)
![](https://img.haomeiwen.com/i8400233/4523cb9e1be614a2.png)
3. 进行webpack配置
在项目根路径下创建webpack.config.js(本示例使用webpack5进行配置,其他版本可以参照官网进行配置)
3.1 配置出入口
const path = require('path')
const { name } = require('./package.json')
module.exports = {
mode: 'development',
// 入口js
entry: ['./src/main.js'],
output: {
publicPath: './',
path: path.resolve(__dirname, './dist'),
filename: '[name].bundle.js',
// 每次打包清空原打包路径内容
clean: true,
// 打包静态资源的文件名
assetModuleFilename: 'assets/[name].[hash:6][ext]',
// 进行ie浏览器支持
environment: {
arrowFunction: false
}
}
}
3.2 配置模块
这一部分需要安装各种loader,如下:expose-loader,babel-loader,css-loader,style-loader,html-loader, @babel/core,@babel/preset-env
module: {
rules: [
// 配置jquery,不需要在html在引入jquery的js文件
{
test: require.resolve('jquery'),
use: [{
loader: 'expose-loader',
options: {
exposes: ['$', 'jQuery']
}
}]
},
// 配置js转译,需要安装loader
{
test: /\.js$/,
exclude: /(node_modules|bower_components)/, // 排除依赖中js文件,提高转译效率
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env']
}
}
},
{
test: /\.css$/,
use: ['style-loader', 'css-loader']
},
// 因为原html中可能加载jsp语法,可以使用html-loader进行转译
{
test: /\.html$/,
include: path.resolve(__dirname, 'src/views'), // 因为html文件都放到了views下面,所以只对下面的html进行解析
use: {
loader: 'html-loader',
options: {
minimize: true
}
}
},
// webpack5新增的配置,可以将图片转为base64,无需使用loader
{
test: /\.(png|jpg|gif)$/,
type: 'asset/inline'
}
]
}
3.3 配置插件
这里也是需要安装一些依赖,如下:node-polyfill-webpack-plugin,progress-bar-webpack-plugin,html-webpack-plugin
const NodePolyfillPlugin = require('node-polyfill-webpack-plugin')
const WebpackBarPlugin = require('progress-bar-webpack-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const glob = require('glob')
// 获取全部html文件
const allHtml = glob.sync('src/views/**/*.html')
plugins: [
// webpack5默认不在提供polyfill,可以引入此插件,配合其他配置来支持ie
new NodePolyfillPlugin(),
// 这里是展示进度,进度条展示*,如果不需要展示,也可以不设置
new WebpackBarPlugin({
complete: '*'
}),
// 使用htmlWebpackPlugin为html文件自动插入打包后的静态资源
new HtmlWebpackPlugin({
title: '我的测试项目',
template: './public/index.html',
filename: 'index.html'
}),
...allHtml.map((item) => {
item = item.split('src/')[1]
return new HtmlWebpackPlugin({
title: item.split('/').join(''),
template: `./src/${item}`,
inject: 'head',
filename: item,
projectPath: 'static'
})
})
]
3.4 配置devServer,可以本地启动jquery前端项目
// 前端本地启动代理
devServer: {
compress: true, // 是否启用gzip压缩
hot: true, // 是否热启动
static: path.join(__dirname, './src'), // 允许配置从目录提供静态文件的选项
proxy: { // 代理配置
'/api': {
target: 'http://******:****',
changeOrigin: true, // 允许跨域
pathRewrite: {
'^/api': ''
}
}
}
}
3.5 兼容IE配置
除了上述loader,babel配置之外,还需要做如下配置:
// webpack5新增配置项,可以兼容ie
target: ['web', 'es5']
安装core-js,我用的是3.24.1版本,执行npm install core-js
在main.js入口文件中添加
// 兼容ie
import 'core-js/stable'
import 'regenerator-runtime/runtime'
到这里,我们的jquery项目配置项就可以结束了。
4. 启动及打包
那么,接下来,在package.json中添加启动命令,就可以启动了。
4.1 在package.json的scripts中添加"serve": "webpack serve --config webpack.config.js"
,这里的配置文件也可以不指定,默认使用webpack.config.js。
执行npm run serve
启动。
![](https://img.haomeiwen.com/i8400233/7705730f4eae8775.png)
启动之后就可以在浏览器中查看效果了。这里是我在index.html中写的几个文字。
![](https://img.haomeiwen.com/i8400233/ce9cd618bf5359c5.png)
4.2 在package.json的scripts中添加"build": "webpack build --config webpack.config.js",这里的配置文件也可以不指定,默认使用webpack.config.js。
执行npm run build
进行项目打包,打包之后可以看到产物如下:
![](https://img.haomeiwen.com/i8400233/88ec2e839b88e6a2.png)
我们的html文件都被打包进去了,且html中保留了之前script标签引入的js文件,并且自动添加了打包之后的main.bundle.js文件。
我们jquery项目有好多html文件,如何添加路由方便前端控制路由跳转呢,可以看另一篇文章更新哦。
网友评论