在MVVM框架大行其道的时代,考虑Mpa来实现一个应用实在有些落伍,但是不免还是有一些应用场景,正如 Webpack构建多页应用Mpa(一) 提到:
如果团队没有专职前端,并且项目预留时间也很紧张,没足够时间去系统学习工程化Vue项目,但是却也想让html、css、js这些代码被打包压缩,尽可能减少文件大小。并且想让项目导出的文件结构尽可能清晰、规整;
src
目录下,打包后的html
、css
、js
等文件统一存放在dist
目录html
、css
、js
代码html
代码中静态资源,如js、css、jpg、gif、ttf等自动检测打包到dist/static/image
、dist/static/font
、dist/static/js
直接运行npm i xxx -S
,可能安装会很慢甚至安装失败;可以修改镜像地址,提供多种方式:
执行命令修改配置
npm config set registry https://registry.npm.taobao.org
安装cnpm,支持全部npm命令。
npm install cnpm -g --registry=https://registry.npm.taobao.org
搭建本地服务器方法比较多,可以使用iis、wamp、phpstudy等;node环境下,我们可以使用http-server
来搭建。
在正式的开发过程中,我们可以开启webpack自带的devServer做热更新调试。热更新调试不会时时导出文件到
dist
目录,而是把最新的文件更新到内存。这里为了方便观察,我们采用http-server
。
在整个实现过程中,经常会出现打包报错的情形,很多是由于各个插件版本差异导致,所以务必安装教程中指定的插件版本,避免不必要的麻烦;
下面我们开始一步步实现,let’s go…
Mpa
项目目录,初始化项目npm init
Mpa
,进入后运行以下命令:npm i -D [email protected]
npm i -D [email protected]
src
目录,并在目录下新建index.js
文件,文件内容如下:console.log("hello world");
webpack.config.js
文件,配置内容如下:module.exports = { mode: "development" };
npx webpack
,会在项目根目录生成dist
目录,并生成main.js
文件package.json
,在scripts
字段添加一行配置。执行npm run dev
来打包,效果等同于npx webpack
。代码如下:
...
"scripts": {
"dev": "npx webpack",
"test": "echo \"Error: no test specified\" && exit 1"
},
...
不光要支持自动生成dist/main.js
文件,还要支持将dist/main.js
插入到对应的html页面,这里借助html-webpack-plugin
插件;
npm i -D [email protected]
src
目录下新建index.html
src/index.html 代码如下:
这是首页
首页
webpack.config.js
./src/index.js
webpack.config.js代码如下:
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = {
entry: "./src/index.js",
output: {
filename: "index.js",
path: path.resolve(__dirname, "dist")
},
mode: "development",
plugins: [
new HtmlWebpackPlugin({
title: "首页", //导出html文件的title
filename: "./index.html", //导出的文件名
template: "./src/index.html" //导出文件的模板
})
]
};
npx webpack
,自动生成dist
文件件,里面有index.js
、index.html
两个文件;dist
目录中自动生成了index.html
文件,并且将最终生成chunk(自动生成的index.js文件)引入了body标签底部,
;dist/index.html 代码如下:
这是首页
首页
dist
目录npm i -D [email protected]
,修改output导出文件名称为main.js
,执行打包npx webpack
,我们看到dist
目录下之前的index.js
文件被自动删除了。生成文件如图:
webpack.config.js 代码如下:
...
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
module.exports = {
output: {
filename: "main.js",
path: path.resolve(__dirname, "dist")
},
plugins: [
new CleanWebpackPlugin(),
...
]
};
识别css、less、sass
等样式文件时,我们需要使用对应的xxx-loader
。
loader是干什么用的,webpack官网给的解答是:webpack 支持使用 loader 对文件进行预处理。你可以构建包括 JavaScript 在内的任何静态资源。并且可以使用 Node.js 轻松编写自己的 loader。
npm i -D [email protected]
npm i -D [email protected]
webpack.config.js
添加css-loader、style-loaderwebpack.config.js 代码如下:
...
module.exports = {
...
module: {
rules: [
{
test: /\.css$/,
use: ["style-loader","css-loader"]
}
]
},
...
};
src/index.css
,并在index.js
头部引入import "./index.css";
src/index.js 代码如下:
import "./index.css";
console.log("hello world");
执行npm run dev
打包后,刷新http://127.0.0.1:8080/,我们看到样式被内嵌到了head
标签中,如图:
使用css-loader和style-loader之后,并不是想要的效果,最好是把引入的css也单独打包出来,然后在dist/index.html
引入。这需要使用mini-css-extract-plugin
插件;
npm i -D [email protected]
webpack.config.js 代码如下:
...
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
module.exports = {
...
module: {
rules: [
{
test: /\.css$/,
use: [MiniCssExtractPlugin.loader, "css-loader"]
}
]
},
plugins: [
...
new MiniCssExtractPlugin({
filename: "[name].css",
chunkFilename: "[name].css"
})
]
};
执行npm run dev
打包后,刷新http://127.0.0.1:8080/,我们看到css文件被引入到了head
标签中,如图:
到这里,实现了整个项目中的基础功能:
1、创建页面必须的html、css、js
文件,打包时自动将chunk
和css
引入到html文件body
标签底部
2、打包时自动清除dist文件夹
3、使用http-server
和npm run dev
,搭建简易的调试环境
后面章节,将实现如下功能:
1、css兼容
2、js语法兼容、es6新特性加绒
3、多页面架构搭建
4、自动打包html中静态资源