共计 3897 个字符,预计需要花费 10 分钟才能阅读完成。
为什要使用 webPack
随着大前端的来临,需要前端处理越来越多的事情,不仅局限页面的交互,项目的需求越来越多,更多的逻辑需要在前端完成,为了简化开发的复杂度,前端社区涌现出了很多好的实践方法。
1. 模块化,一种将复杂系统分解为可管理模块的方式,简单来说就是解耦,简化开发,一个模块就是实现特定功能的文件,想要什么功能,就加载什么模块,完美的实现了代码重用。其中三大剑客便是 Angular,React 和 Vue2.JavaScript 的拓展的开发语言 typescript,能够实现目前版本的 JavaScript 不能直接使用的特性,并且之后还能转换为浏览器可识别的 javascript 语言 3.scss less 等 CSS 预处理器 …. 这些改进确实大大的提高了我们的开发效率,但是利用它们开发的文件往往需要进行额外的处理才能让浏览器识别, 而手动处理又是非常繁琐的,这就为 webPack 类的工具的出现提供了需求。
webpack 是什么
webpack 是一个模块打包工具,它可以将许多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源。还可以将按需加载的模块进行代码分割,等到实际需要的时候再异步加载。
webpack 支持的模块
1.ES2015 import 语句 2.CommonJS require()语句 3.AMD define 和 require 语句 4.css/sass/less 文件的 @import 语句 5. 样式 (url(…)) 或 HTML 文件(<img src=…>) 中的图片链接(image url)
webPack 的特点
1. 丰富的插件,方便进行开发工作 2. 大量的加载器,包括加载各种静态资源 3. 代码分割,提供按需加载的能力 4. 发布工具
webpack 的工作方式
把项目当做一个整体,通过一个给定的主文件(如:index.js),从这个文件开始找到你的项目的所有依赖文件,使用 loaders 处理它们,最后打包为一个(或多个)浏览器可识别的 JavaScript 文件。
开始项目搭建
1. 全局安装 webpack
npm install -g webpack
2. 创建练习文件夹
mkdir webpack_pratice
3. 创建 package.json 文件
进入到 webpack_pratice, 创建 package.json 文件, 在终端中使用 npm init 命令可以自动创建这个 package.json 文件
npm init
输入这个命令后,终端会问你一系列诸如项目名称,项目描述,作者等信息,不过不用担心,如果你不准备在 npm 中发布你的模块,这些问题的答案都不重要,回车默认即可。package.json 是一个标准的 npm 说明文件,里面蕴含了丰富的信息,包括当前项目的依赖模块,自定义的脚本任务等等。
4. 安装项目需要模块
npm install webpack webpack-cli –save-dev
npm install typescript ts-loader –save-dev
npm install style-loade node-sass sass-loader css-loader –save-dev
npm install extract-text-webpack-plugin@next –save-dev
npm install html-webpack-plugin –save-dev
注意:extract-text-webpack-plugin 最新版本为 3.0.2,这个版本还没有适应 webpack 4 的版本,所以安装的时候需要 extract-text-webpack-plugin@next
5. 构建项目结构
a. 创建 src 目录,增加 index.html main.ts common.css main.scss
index.html
<!DOCTYPE html>
<html lang=”en”>
<head>
<meta charset=”UTF-8″>
<title>webpack 测试 </title>
</head>
<body>
<div class=”test-block”>
Webpack
</div>
</body>
</html>
main.ts
import ‘./main.scss’
class TestMain {
name: string;
age: number;
constructor (name: string, age: number) {
this.name = name;
this.age = age;
};
testFun() {
console.log(this.name + ’—‘ + this.age)
}
}
let testMain = new TestMain(“Miss D”, 18);
testMain.testFun();
common.css
html,body{
margin: 0;
padding: 0;
font-size: 25px;
color: yellow;
}
main.scss
@import “common.scss”;
.test-block{
width: 300px;
height: 300px;
margin: 0 auto;
background: green;
}
b. 创建 dist 文件夹 c. 创建 TypeScript 的配置文件 tsconfig.json
{
“compilerOptions”: {
“module”: “commonjs”,
“target”: “es5”,
“sourceMap”: true
},
“exclude”: [
“node_modules”
]
}
d. 创建 webpack 的配置文件 webpack.config.js
const path = require(‘path’);
const htmlWebpackPlugin = require(‘html-webpack-plugin’);
const ExtractTextPlugin = require(‘extract-text-webpack-plugin’);
module.exports = {
entry: ‘./src/main.ts’, // 模块的入口
output: {// 输出配置
filename: ‘[name].bundle.js’,
path: path.resolve(__dirname, ‘dist’)
},
module: {// 资源模块的处理器
rules: [
{
test: /\.tsx?$/,
use: ‘ts-loader’,
exclude: path.resolve(__dirname, ‘node_modules’),
include: path.resolve(__dirname, ‘src’),
},
{
test: /\.scss$/,
use: ExtractTextPlugin.extract({
fallback: {
loader: “style-loader”
},
use: [
{
loader: “css-loader”,
},
{
loader: “sass-loader”
}
]
})
}]
},
plugins: [// 插件配置
new ExtractTextPlugin({
filename: “[name].min.css”
}),
new htmlWebpackPlugin({
template: ‘./src/index.html’,
inject: ‘head’
})
]
}
e. 项目文件夹结构
6.package.js 配置 build 执行脚本
{
“name”: “webpack-pratice”,
“version”: “1.0.0”,
“description”: “”,
“scripts”: {
“test”: “echo \”Error: no test specified\” && exit 1″,
“build”: “webpack –config webpack.config.js”
},
“author”: “”,
“license”: “ISC”,
“devDependencies”: {
“html-webpack-plugin”: “^3.2.0”,
“css-loader”: “^2.1.0”,
“extract-text-webpack-plugin”: “^4.0.0-beta.0”,
“node-sass”: “^4.11.0”,
“sass-loader”: “^7.1.0”,
“style-loader”: “^0.23.1”,
“ts-loader”: “^5.3.3”,
“typescript”: “^3.3.3333”,
“webpack”: “^4.29.6”,
“webpack-cli”: “^3.2.3”
}
}
7. 执行打包命令
npm run build
打包结果
7. 运行 index.html
项目的 scss 样式和 typescript 文件,解析成浏览器能识别的 css 和 javascript 文件,且自动引入到 index.html 文件中。
官方参考
1.webpack 官网 链接描述 2.html-webpack-plugin 插件 链接描述 3.extract-text-webpack-plugin 插件 链接描述
踩坑
如果使用 webpack,style-loader 出现的错误:
ERROR in {project}/node_modules/style-loader/lib/addStyles.js
Module not found: Error: Can’t resolve ‘./urls’ in ‘{project}\node_modules\style-loader\lib’
解决方法:直接修改 {project}/node_modules/style-loader/lib/addStyles.js 文件:把 require(“./urls”) 改为 require(“./urls.js”)