内容简介:webpack 在如今的前端开发中,算是不可绕过的一个工具吧。特别是在开发SPA应用的时候,无论是开发环境,还是打包上线,都十分依赖webpack。
webpack 在如今的前端开发中,算是不可绕过的一个 工具 吧。特别是在开发SPA应用的时候,无论是开发环境,还是打包上线,都十分依赖webpack。
开发环境
win10
node -v: 10.15.0
npm -v: 6.4.1
Let's go。
体验0配置
进入到工作目录,然后创建项目
mkdir spa-webpack-demo 复制代码
初始化
npm init -y 复制代码
先来体验下 webpack4 的 0配置 :
安装 webpack
npm i -D webpack 复制代码
安装好 webpack 依赖后,创建 src 文件夹,并在 src 中新建一个 index.js 。
mkdir src cd src type nul > index.js 复制代码
修改 package.json ,在 scripts 选项中,添加两个命令:
"dev": "webpack --mode=development", "prod": "webpack --mode=production" 复制代码
好,完事了。接下来跑命令行,测试一下
npm run dev 复制代码
正常情况下,控制台会有一段如下提示,因为 webpack 命令需要依赖 webpack-cli ,我们安装即可
Do you want to install 'webpack-cli' (yes/no): yes 复制代码
webpack-cli 安装完成之后,会自动继续跑我们的 npm run dev 指令,即可看到项目中多了一个 dist 目录,而且多了一个 main.js 。
接下来继续尝试 npm run prod ,可以看到 dist/main.js 已被压缩。
这就是 webpack 号称的零配置,主要的工作就是定义了默认的 entry 路径 src/index.js ,定义了默认的 output 路径 dist/main.js ,然后加了一个 mode 参数,根据 mode 参数的不同帮我们添加一些预置的打包规则。
循序渐进
上述的流程里,只是体验了一把零配置的感觉,连html文件都没有,这里开始加上。
加个index.html
在根目录新建 index.html ,随便编写点内容
type nul > index.html 复制代码
说到处理 html 文件,肯定少不了 html-webpack-plugin , 安装它
npm i -D html-webpack-plugin 复制代码
然后再 项目根目录 新建一个 webpack.config.js ,webpack会自动使用它
type nul > webpack.config.js 复制代码
webpack.config.js 的内容如下
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
module: {
rules: []
},
plugins: [
new HtmlWebpackPlugin({
filename: 'index.html',
template: 'index.html'
})
]
}
复制代码
执行 npm run dev ,即可看到 dist 文件夹多了个 index.html ,这个 index.html 自动引入了打包后的 dist/main.js 。
加个本地服务器
index.html 是生成了,可总不能每次手动打开它在浏览器里面预览吧, webpack 官方推荐我们用 webpack-dev-server 做服务器,安装它
npm i -D webpack-dev-server 复制代码
安装成功后, 修改 webpack.config.js ,添加 devServer 选项 和 webpack.HotModuleReplacementPlugin 插件。
对于文件中已经添加过的内容,后面我都会用注释表示。
const path = require('path');
const webpack = require('webpack');
function resolve(dir) {
return path.join(__dirname, './', dir)
}
module.exports = {
// module - 略
devServer: {
contentBase: resolve('dist'), // 根目录
hot: true, // 是否开启热替换,无须手动刷新浏览器
port: 8081, // 端口
open: true, // 是否自动打开浏览器
noInfo: true // 不提示打包信息,错误和警告仍然会显示
},
plugins: [
new webpack.HotModuleReplacementPlugin(),
// HtmlWebpackPlugin - 略
]
}
复制代码
然后修改 package.json scripts 的 dev 选项
"dev": "webpack-dev-server --mode=development", 复制代码
注意:当 devServer 的 hot 参数为 true 时,记得要在插件里添加 new webpack.HotModuleReplacementPlugin() , 或者你可以在命令行中带上 hot 参数,这样就不需要自己再往 plugins 中添加插件了。
"dev": "webpack-dev-server --hot --mode=development" 复制代码
然后 npm run dev ,就可以尝试 静态资源 热替换功能了。
处理js, css 等其他静态资源
首先我们要清楚一点,webpack 它本身是不知道应该如何处理静态资源的,但是它提供了 loader 和 plugin 机制。
loader 的作用,顾名思义:加载器,就是匹配到的静态资源,都要经过 loader 的内部处理,再返回处理之后的结果。我觉得, loader 像是一个拦截器。
说到js,我们会想到 babel-loader , babel-loader 是干吗的?常规操作是,将匹配到的 js文件 的ES6代码 根据 babelrc文件内的配置 编译成对应的 ES5代码。
我们这里先添加一个 .babelrc 文件
新增 .babelrc 文件
type nul > .babelrc 复制代码
编辑 .babelrc 内容
{
// 预设置,告诉Babel要转换的源码使用了哪些新的语法特性
// targets, useBuiltIns 等选项用于编译出兼容目标环境的代码
// 其中 useBuiltIns 如果设为 "usage"
// Babel 会根据实际代码中使用的 ES6/ES7 代码,以及与你指定的 targets,按需引入对应的 polyfill
// 而无需在代码中直接引入 import '@babel/polyfill',避免输出的包过大,同时又可以放心使用各种新语法特性。
"presets": [
["@babel/preset-env", {
// modules 是否 将 ES6 的 import/export模块化 转为 babel 的 CommonJs 规范模块化
"modules": false,
"targets": {
// "> 1%" : 支持市场份额超过1%的浏览器,
// ""last 2 versions"": 支持每个浏览器最后两个版本
// "not ie <= 8": 在之前条件的浏览器中,排除 IE8 以下的浏览器
"browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
},
"useBuiltIns": "usage"
}]
],
// 所用插件
// transform-runtime 插件表示不管浏览器是否支持ES6,只要是ES6的语法,它都会进行转码成ES5
// 这个是需要优化的
"plugins": ["@babel/plugin-transform-runtime"]
}
复制代码
安装 babel 依赖,注意:
babel 7+ 已经废弃了presets 中 stage-x 的用法,改为在plugins中添加。并且应用了npm scope包,代码全部在 @babel 中,避免以前那种 babel-preset-xxx, babel-plugin-xxx 的用法
最新的 babel-loader 版本是8+,需要依赖 babel-core 版本7+,包名为 @babel/core, 版本6+的包名为 babel-core 。
再分析上面的 .babelrc 文件,它用到了@babel/preset-env, @babel/plugin-transform-runtime, 这些依赖都要我们安装好
如果使用了 @babel/preset-env,则不支持在 plugins 中 添加 stage-x
npm i -D babel-loader @babel/core @babel/preset-env @babel/plugin-transform-runtime 复制代码
谈到css,我们就应该 想到 style-loader 和 css-loader 。先安装它们
npm i -D style-loader css-loader 复制代码
再安装 url-loader 用于解析静态资源,如图片,字体等
npm i -D url-loader 复制代码
然后修改 webpack.config.js 的 rules , 添加如下代码
module.exports = {
module: {
rules: [
{
test: /\.js$/,
loader: 'babel-loader',
include: [
resolve('src'),
resolve('node_modules/webpack-dev-server/client')
]
},
{
test: /\.css$/,
use: ['style-loader', 'css-loader']
},
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
loader: 'url-loader',
exclude: [],
options: {
limit: 10000,
name: 'img/[name].[hash:7].[ext]'
}
}
]
},
// devServer - 略
// plugins - 略
}
复制代码
接下来准备开发了,用 vue 吧。
vue 就不用装在 devDependencies 中了。
npm i -S vue // vue-loader 依赖 vue-template-compiler 和 vue-style-loader npm i -D vue-loader vue-template-compiler vue-style-loader 复制代码
修改 webpack.config.js , 添加 如下代码
const { VueLoaderPlugin } = require('vue-loader');
module.exports = {
resolve: {
extensions: ['.js', '.vue', '.json'],
alias: {
'@': resolve('src')
}
},
module: {
rules: [
{
test: /\.vue$/,
loader: 'vue-loader'
},
// 其他 - 略
]
},
// devServer - 略
plugins: [
// 加在最前面
new VueLoaderPlugin()
// 其他 - 略
]
}
复制代码
src 下 新建一个 views 目录 和 assets 目录,
我在 assets 目录下,增加了一个 logo.png 文件
views下创建一个 myTest 组件, myTest/index.vue , 编辑 index.vue
<template>
<div>
<i class="logo"></i>
</div>
</template>
<script>
export default {
name: 'myTest'
}
</script>
<style scoped>
.logo {
display: block;
margin: auto;
width: 400px;
height: 400px;
background: url(../../assets/logo.png);
}
</style>
复制代码
src 目录下新建一个 App.vue , 内容如下
<template>
<div id="app">
<my-test></my-test>
</div>
</template>
<script>
import myTest from "./views/myTest/index";
export default {
name: "App",
components: {
myTest
}
};
</script>
复制代码
编辑 src 目录下的 index.js ,内容如下:
import Vue from 'vue';
import App from './App';
new Vue({
el: '#app',
render: h => h(App)
})
复制代码
最后 npm run dev ,查看效果。
锦上添花
添加 打包进度条 信息,如下
npm i -D progress-bar-webpack-plugin 复制代码
修改 webpack.config.js
const ProgressBarPlugin = require('progress-bar-webpack-plugin');
// ....
plugins: [
// 其他 - 略
new ProgressBarPlugin()
]
复制代码
添加 打包结果消息通知
npm i -D webpack-build-notifier 复制代码
修改 webpack.config.js
const WebpackBuildNotifierPlugin = require('webpack-build-notifier');
// ....
plugins: [
// 其他 - 略
new WebpackBuildNotifierPlugin()
]
复制代码
归类打包信息
npm i -D webpack-dashboard 复制代码
修改 webpack.config.js
const DashboardPlugin = require('webpack-dashboard/plugin');
// ....
plugins: [
// 其他 - 略
new DashboardPlugin()
]
复制代码
修改 package.json
"dev": "webpack-dashboard -- webpack-dev-server --mode=development" 复制代码
这个我使用了,感觉效果不是很理想啊,会新开一个窗口,而且还不能滚动查看信息,不清楚是不是哪里用错了。
效果如图:
整个代码结构如图:
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
《电脑报》2005年合订本(上下)
电脑报社主编 / 西南师范大学出版社 / 2006-1 / 45.00元
全套上、下两册,浓缩2005年电脑报精华文章;附录包含70余篇简明IT应用指南,涵盖软件、硬件、数码、网络四大领域,配赠权威实用的2005-2006中国计算机年鉴光盘,近1.4GB海量信息与资源超值奉献,提供2005-2006全系列硬件、数码产品资讯,兼具知识性与资料性,连结购买每年《电脑报合订本》,你将拥有一套完整的实用大型电脑文库。一起来看看 《《电脑报》2005年合订本(上下)》 这本书的介绍吧!