二、搭建基础的前端开发环境
2.1 关联 HTML
webpack
默认从作为入口的 .js
文件进行构建(更多是基于 SPA
去考虑),但通常一个前端项目都是从一个页面(即 HTML)出发的,最简单的方法是,创建一个 HTML 文件,使用 script
标签直接引用构建好的 JS 文件,如…
<script src="./dist/bundle.js"></script>
- 但是,如果我们的文件名或者路径会变化,例如使用
[hash]
来进行命名,那么最好是将HTML
引用路径和我们的构建结果关联起来,这个时候我们可以使用html-webpack-plugin
html-webpack-plugin
是一个独立的node package
,所以在使用之前我们需要先安装它,把它安装到项目的开发依赖中
npm install html-webpack-plugin -D
然后在 webpack
配置中,将 html-webpack-plugin
添加到 plugins
列表中
const HtmlWebpackPlugin = require('html-webpack-plugin') module.exports = { // ... plugins: [ new HtmlWebpackPlugin(), ], }...
这样配置好之后,构建时 html-webpack-plugin
会为我们创建一个 HTML
文件,其中会引用构建出来的 JS 文件。实际项目中,默认创建的 HTML
文件并没有什么用,我们需要自己来写 HTML
文件,可以通过 html-webpack-plugin
的配置,传递一个写好的 HTML 模板…
module.exports = { // ... plugins: [ new HtmlWebpackPlugin({ filename: 'index.html', // 配置输出文件名和路径 template: 'assets/index.html', // 配置文件模板 }), ], }...
这样,通过 html-webpack-plugin
就可以将我们的页面和构建 JS
关联起来,回归日常,从页面开始开发。如果需要添加多个页面关联,那么实例化多个 html-webpack-plugin
, 并将它们都放到 plugins
字段数组中就可以了…
2.2 构建 CSS
我们编写 CSS
,并且希望使用 webpack
来进行构建,为此,需要在配置中引入 loader
来解析和处理 CSS
文件
module.exports = { module: { rules: [ // ... { test: /\.css/, include: [ path.resolve(__dirname, 'src'), ], use: [ 'style-loader', 'css-loader', ], }, ], } }...
css-loader
负责解析CSS
代码,主要是为了处理CSS
中的依赖,例如@import
和url()
等引用外部文件的声明;style-loader
会将css-loader
解析的结果转变成JS
代码,运行时动态插入style
标签来让CSS
代码生效…
经由上述两个 loader
的处理后,CSS 代码会转变为 JS,和 index.js
一起打包了。如果需要单独把 CSS 文件分离出来,我们需要使用 extract-text-webpack-plugin
插件
const ExtractTextPlugin = require('extract-text-webpack-plugin') module.exports = { // ... module: { rules: [ { test: /\.css$/, // 因为这个插件需要干涉模块转换的内容,所以需要使用它对应的 loader use: ExtractTextPlugin.extract({ fallback: 'style-loader', use: 'css-loader', }), }, ], }, plugins: [ // 引入插件,配置文件名,这里同样可以使用 [hash] new ExtractTextPlugin('index.css'), ], }...
2.3 CSS 预处理器
在上述使用 CSS 的基础上,通常我们会使用 Less/Sass
等 CSS 预处理器,webpack 可以通过添加对应的 loader
来支持,以使用 Less
为例,我们可以在官方文档中找到对应的 loader
module.exports = { // ... module: { rules: [ { test: /\.less$/, // 因为这个插件需要干涉模块转换的内容,所以需要使用它对应的 loader use: ExtractTextPlugin.extract({ fallback: 'style-loader', use: [ 'css-loader', 'less-loader', ], }), }, ], }, // ... }...
2.4 处理图片文件
在前端项目的样式中总会使用到图片,虽然我们已经提到 css-loader
会解析样式中用 url()
引用的文件路径,但是图片对应的 jpg/png/gif
等文件格式, webpack
处理不了。是的,我们只要添加一个处理图片的 loader
配置就可以了,现有的 file-loader
就是个不错的选择…
file-loader
可以用于处理很多类型的文件,它的主要作用是直接输出文件,把构建后的文件路径返回。配置很简单,在rules
中添加一个字段,增加图片类型文件的解析配置
module.exports = { // ... module: { rules: [ { test: /\.(png|jpg|gif)$/, use: [ { loader: 'file-loader', options: {}, }, ], }, ], }, }...
2.5 使用 Babel
Babel
是一个让我们能够使用 ES
新特性的 JS
编译工具,我们可以在 webpack
中配置 Babel,以便使用 ES6
、 ES7
标准来编写 JS
代码
module.exports = { // ... module: { rules: [ { test: /\.jsx?/, // 支持 js 和 jsx include: [ path.resolve(__dirname, 'src'), // src 目录下的才需要经过 babel-loader 处理 ], loader: 'babel-loader', }, ], }, }...
2.6 启动静态服务
至此,我们完成了处理多种文件类型的 webpack 配置。我们可以使用 webpack-dev-server
在本地开启一个简单的静态服务来进行开发
"scripts": { "build": "webpack --mode production", "start": "webpack-dev-server --mode development" }
尝试着运行 npm start
或者 yarn start
,然后就可以访问 http://localhost:8080/
来查看你的页面了。默认是访问 index.html
,如果是其他页面要注意访问的 URL 是否正确
2.7 完整示例代码
const path = require('path') const HtmlWebpackPlugin = require('html-webpack-plugin') const ExtractTextPlugin = require('extract-text-webpack-plugin') module.exports = { entry: './src/index.js', output: { path: path.resolve(__dirname, 'dist'), filename: '[name].js', }, module: { rules: [ { test: /\.jsx?/, include: [ path.resolve(__dirname, 'src'), ], use: 'babel-loader', }, { test: /\.less$/, // 因为这个插件需要干涉模块转换的内容,所以需要使用它对应的 loader use: ExtractTextPlugin.extract({ fallback: 'style-loader', use: [ 'css-loader', 'less-loader', ], }), }, { test: /\.(png|jpg|gif)$/, use: [ { loader: 'file-loader' }, ], }, ], }, // 代码模块路径解析的配置 resolve: { modules: [ "node_modules", path.resolve(__dirname, 'src'), ], extensions: [".wasm", ".mjs", ".js", ".json", ".jsx"], }, plugins: [ new HtmlWebpackPlugin({ filename: 'index.html', // 配置输出文件名和路径 template: 'src/index.html', // 配置文件模板 }), new ExtractTextPlugin('[name].css'), ], }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论