为什要使用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.全局安装webpacknpm install -g webpack2.创建练习文件夹mkdir webpack_pratice3.创建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@next5.构建项目结构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.tsimport ‘./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.csshtml,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.jsconst 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.jsModule 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”)