概念
如果你对 webpack 没有太多的了解,本章可以带你了解 X-BUILD 的基本工作原理,让你节省大量的时间快速享受 webpack 带来的便捷。
注意
本章节内所有内容均不需要你做配置,仅需了解即可。
入口文件
X-BUILD 在初始化项目时,预先做好了入口文件的关联,你无需关心 html/js/css 文件是如何关联在一起的:
HTML
使用 HtmlWebpackPlugin 配置了 HTML 入口模板文件(src/index.[html/pug]),当你初始化项目时选择了 Pug(Jade) 选项后,会自动安装 pug-loader 来支持 pug 或 jade 文件,在这里还是很推荐使用 pug 作为 HTML 的模板引擎。
CSS
初始化项目时如果选择了 CSS Pre-processors 选项,会再次询问你选择哪种 CSS 预处理器作为开发工具(单选),随后会安装相对应的 loader,推荐至少掌握一种 CSS预处理器。
PostCSS 插件 Autoprefixer 自动补全浏览器私有前缀。若使用更多的插件请自行安装,然后在跟目录下的 postcss.config.js 中配置。
JavaScript
Babel : 它能让你编写的新版本 JavaScript 代码,在旧版浏览器中依然能够工作。
ESLint : 语法规则和代码风格的检查工具,它的目标是保证代码的一致性和避免错误。
TypeScript : TypeScript 并不是一个完全新的语言, 它是 JavaScript 的超集,为 JavaScript 的生态增加了类型机制,并最终将代码编译为纯粹的 JavaScript 代码。
快速创建的项目并不包含这两项功能,但 create 命令中还是将这两项作为默认选中状态,他们可以帮你养成书写更加先进和规范的代码。
静态资源
webpack 将动态打包所有依赖,因为现在每个模块都可以明确表述它自身的依赖,可以避免打包未使用的模块。
创建目录 *
初始化的项目中并没有静态资源目录,但这并不代表你可以任意放置你的资源文件:
在 src/ 目录下创建 assets/ 目录:
图片:创建目录 assets/images,支持 png|jpe?g|gif|svg|webp 格式。
字体:创建目录 assets/font,支持 woff|eot|ttf|otf 格式。
视频:创建目录 assets/media/,支持mp4|webm|ogg|mp3|wav|flac|aac 格式。
webpack 把一切资源都当作模块来处理,你可以通过 require('')
来引入这些文件,X-BUILD 已经帮你安装好了读取这些文件的 loader,可以放心使用。
加载数据(后期实现)
可以加载的有用资源还有数据,如 JSON 文件,CSV、TSV 和 XML。类似于 NodeJS,JSON 支持实际上是内置的,也就是说 import Data from './data.json' 默认将正常运行。要导入 CSV、TSV 和 XML,你可以使用 csv-loader 和 xml-loader。让我们处理加载这三类文件:
npm install --save-dev csv-loader xml-loader
在 xbuild.config.js 中 loaders 加入以下代码:
loaders: [
{
test: /\.(csv|tsv)$/,
use: [
'csv-loader'
]
},
{
test: /\.xml$/,
use: [
'xml-loader'
]
}
]
开发环境
HMR
模块热替换(hot module replacement 或 HMR)是 webpack 提供的最有用的功能之一,它允许在运行时更新所有类型的模块,而无需完全刷新。
Source Map
此项可以将编译后的代码映射回原始源代码,当你的代码在浏览器中报错时,可以辅助你快速定位到源码的位置。
wacth
被依赖的文件发生更改时,都触发重新编译,所以你不必再去手动运行整个构建。
生产环境
模块分离
此特性能够把代码分离到不同的 bundle 中,然后可以按需加载或并行加载这些文件。代码分离可以用于获取更小的 bundle,以及控制资源加载优先级。
CSS 分离
默认情况下,CSS 会被打包在 JavaScript 文件中,X-BUILD 使用 ExtractTextWebpackPlugin 从 bundle 中提取文本(CSS)到单独的文件。
清理 /dist 文件夹
当执行 npm run build
后,X-BUILD 将编译好的文件输出在跟目录下的 dist 目录中,当再次编译或使用开发环境时会清理掉 dist 目录。
环境变量
NODE_ENV 是一个由 Node.js 暴露给执行脚本的系统环境变量,通过 process.env.NODE_ENV 可以区分开发与生产环境:
生产环境:[ production ]
开发环境:[ development ]
// example
if (process.env.NODE_ENV !== 'production') {
console.log('Looks like we are in development mode!');
}
自适应解决方案
X-BUILD 采用 px2rem-loader + hotcss 的自适应解决方案,在初始化时选择 Mobile layout 即可开启此项功能。
用法
首先要和设计师沟通,确定设计稿的宽度,例如 750px,当然这并不是最优设定,你可以在 xbuild.config.js 中设置 designWidth,类型为 Number。
随后在代码中设计图内的元素尺寸是多少像素,在 css 中写同样的尺寸即可,在浏览器中可以查看已经将 px 转化为 rem,更换设备后发现显示效果完全一致。
请求接口
当有大量的接口时,使用 X-BUILD 提供的自动加载 api 模块将节省大量操作:
API 目录
src/api/index.js 为 api 主入口文件,使用 webpack 提供的 require.context 方法,将 api/ 内的所有文件(包括子路径)自动加载,并通过 ES6 导出一个对象。
使用方式
假设创建一个 GET 请求,在 api/ 目录下创建 getUser.js,在此我们使用 axios 举例:
// getUser.js
import axios from 'axios';
export default function () {
return axios.get('...')
}
此时导出的文件会被 index.js 获取到,并且会以文件名作为对象内的 key 导出。
使用接口
假设在 src/srcipts/index.js 中使用接口:
import Api from '../api'
Api.getUser()