前端工程化之推开webpack世界的大门

简介: 在前端开发领域独立负责项目已有不少,从刚开始的angular1.x到vuejs再到react,前端常用的三大框架都有接触。用过的人都知道这三个框架的使用都离不开webpack,从本地开发到线上部署,webpack给我们带来了很大的方便,所以说精通webpack是现如今前端的必备技能之一,本章总结下自己对webpack知识体系的认知。

前言


在前端开发领域独立负责项目已有不少,从刚开始的angular1.x到vuejs再到react,前端常用的三大框架都有接触。用过的人都知道这三个框架的使用都离不开webpack,从本地开发到线上部署,webpack给我们带来了很大的方便,所以说精通webpack是现如今前端的必备技能之一,本章总结下自己对webpack知识体系的认知。

wepback基本知识


先来张思维导图,内容不太全后续会继续更新。

简单的说webpack就是一个模块打包器,但是它具备但功能不仅仅是打包,图片压缩,语法转换,开发工具等等,总的说来webpack是前端工程师实现前端架构一个构建工具,有了webpack能让我们前端架构更快更合理的实现。

功能

  • 转换语法:如typescript/vue/jsx/es6等语法转换成浏览器识别的语法
  • css预处理:
  • 代码压缩混淆:提高了项目的性能以及代码的安全性(对比未混淆之前的项目混淆后源码相当于不可见)。
  • 图片压缩
  • 提升代码可维护性:代码更统一(如用eslint配合约束代码)。
  • 提升开发效率:各种开发工具,方便前端工程师本地开发联调。

核心概念

  • 入口:指示webpack应该使用哪个模块,来作为构建其内部依赖图的开始。
  • 输出:指示webpack在哪里输出它所创建的 bundles。
  • loader:loader 让 webpack 能够去处理那些非 JavaScript 文件。
  • 插件:webpack功能的扩展,可以用来处理各种各样的任务。

基本使用方式


初始化

  • 安装nodejs
  • 新建项目目录
  • 初始化package.json
npm init
  • 安装webpack等相关依赖

配置

  • 入口的配置,是在webpack.config.js的modules中的entry,定义wepack的入口文件
module.exports = {
  //入口文件的路径
  entry: './index.js'
};
  • 可以配置多入口
module.exports = {
  //入口文件的路径
  entry:{
     home: "./home.js",
     about: "./about.js",
     contact: "./contact.js"
  }
};
  • loader(module)配置,loader的配置是在webpack.config.js的modules中的test 属性,用于标识出应该被对应的 loader进行转换的某个或某些 文件。另外use 属性,表示进行转换时,应该使用哪个 loader。
const path = require('path');
const config = {
  output: {
    filename: 'test.txt.bundle.js'
  },
  //loader定义
  module: {
    rules: [
    //test中可以传入正则来匹配
      { test: /\.txt$/, use: 'raw-loader' }
    ]
  }
};
module.exports = config;

注:loader的作用简单来说就是将本地文件(vue,jsx,ts)转换成浏览器识别的文件,即loader 用于对模块的源代码进行转换。

  • plugin 配置插件,插件的配置是在webpack.config.js的plugins中的,例如:
plugins:[
        //自动生成html文件
        new HtmlWebpackPlugin({
            title: 'html management'
        }),
    ]

注:插件主要是webpack功能的扩展,比如自动生成html,本地服务器...

  • output配置文件输出路径,输出的配置是在webpack.config.js的modules中的output对象中,定义文件输出的位置,例如:
output:{
        filename:'[name].bundle.js',
        path:path.resolve(__dirname,'dist'),
        //该配置能帮助你为项目中的所有资源指定一个基础路径,正常会设置为根目录
        publicPath:'/'
    }
  • resolve配置模块解析,这些选项能设置模块如何被解析。resolver是一个库(library),用于帮助找到模块的绝对路径。一个模块可以作为另一个模块的依赖模块,然后被后者引用。灵位resolve有以下常用属性:
//1.ailas:创建 import 或 require 的别名,来确保模块引入变得更简单
//2.extensions:自动解析确定的扩展。默认值为[".js", ".json"]
//3.modules:告诉 webpack 解析模块时应该搜索的目录。
//4.plugin:应该使用的额外的解析插件列表。
resolve:{
    ailas:{
        component:path.resolve(__dirname, 'src/component/')
    },
    extensions:[".json",'.jsx','.js'],
    module:['node_modules'],
    plugins:[
    //提供全局的变量,在模块中使用无需用require引入
    new webpack.ProvidePlugin({
      $: "jquery"
    })
    ]
}

运行

  • 为了方便开发,我们会根据当前环境设置不同的配置文件(或者同一个文件设置不同的配置内容),然后在package.json的scripts中设置相关命令,例如:
scripts:{
    "start":"webpack --config webpack.dev.conf.js",
    "build":"webpack --config webpack.conf.js"
}

webpack相关


targets

因为服务器和浏览器代码都可以用js编写,所以webpack提供了多种构建目标(target),常用的有web(默认值) node。其他目标类型请查看文档

//编译为类 Node.js 环境可用(使用 Node.js require 加载 chunk)
    target:'node'
    //自定义目标,可以传入个函数通过插件来自定义目标
    target: (compiler) => {
    compiler.apply(
      new webpack.JsonpTemplatePlugin(options.output),
      new webpack.LoaderTargetPlugin("web")
    );
  }

devtool的设置

此选项控制是否生成,以及如何生成 source map。默认为false,常用的配置有:soure-map inline-source-map 其他 devtool属性 请查看文档

//不生成原始源代码的source.map.*文件,而是合并到bundle文件中
devtool:"inline-source-map"
//生成一份包含原始源代码.source.map.*文件
devtool:"source-map"

externals

此配置选项提供了「从输出的 bundle 中排除依赖」的方法 。即当需要引用一个库,但是又不想被打包,并且又不影响我们在程序中以CMD、AMD或者window/global全局等方式进行使用,那就可以通过配置externals。,例如:

//html中
<script
  src="https://code.jquery.com/jquery-3.1.0.js"
  integrity="sha256-slogkvB1K3VOkzAI8QITxV3VzpOnkeNVsKvtkYLMjfk="
  crossorigin="anonymous">
</script>
//配置中可以这样设置:表示应该排除 import $ from 'jquery' 中的 jquery 模块。
externals: {
  jquery: 'jQuery'
}
//代码中正常的使用
import $ from 'jquery'

常用npm包介绍

如果想要精通webpack,那掌握nodejs基础是我们绕不过的坎,一下几个npm包和node api个人认为必须要会使用的:

  • path
//连接文件路由使其成为绝对路径
path.resolve(__dirname,'index.js')
  • fs:文件的读取/复制/删除/新建等操作
  • inquirer:交互式命令包
  • chalk:console输出字体颜色的设置

常用插件

  • HtmlWebpackPlugin:生成html文件
  • CleanWebpackPlugin:清除上一次生成的文件
  • WebpackDevServer:本地服务启动
  • EnvironmentPlugin:设置环境变量的值
  • HotModuleReplacementPlugin:模块热替换插件

本节只是简单介绍下常用的插件,关于插件我会用单独的一章来介绍。详细文档请查看

总结


随着前端工程化的发展,webpack的使用熟练与否也成为了判断是否是一名合格的前端开发的标准之一,通过对webpack进一步的学习是我了解了他不仅仅是一个前端打包工具。本系列文章是自己对webpack一些浅显的认识。


相关文章
|
3月前
|
前端开发 测试技术 持续交付
版本控制和团队协作:前端工程化的关键要素
版本控制和团队协作:前端工程化的关键要素
|
3月前
|
前端开发 JavaScript 测试技术
探索现代前端工程化工具与流程:提升开发效率和项目质量
探索现代前端工程化工具与流程:提升开发效率和项目质量
探索现代前端工程化工具与流程:提升开发效率和项目质量
|
3月前
|
缓存 前端开发 JavaScript
「零基础」掌握Webpack:10个必学技巧,为前端项目保驾护航!(三)
「零基础」掌握Webpack:10个必学技巧,为前端项目保驾护航!
|
3月前
|
自然语言处理 前端开发 测试技术
前端工程化最佳实践:项目结构、代码规范和文档管理
前端工程化最佳实践:项目结构、代码规范和文档管理
|
30天前
|
前端开发 JavaScript
前端Webpack5高级进阶课程
本套视频教程主要内容包含React/Vue最新版本脚手架分析、基于Webpack5编写自己的loader和plugin等,让你开发时选择更多样,最后,用不到一百行的代码实现Webpack打包。通过本套视频教程的学习,可以帮你彻底打通Webpack的任督二脉,技术水平更上一层楼,在开发项目的道路上畅通无阻
13 3
前端Webpack5高级进阶课程
|
1月前
|
前端开发 JavaScript 容器
前端vw自适应解决方案,适用pc端以及移动端,适用webpack以及vite,适用vue以及react
前端vw自适应解决方案,适用pc端以及移动端,适用webpack以及vite,适用vue以及react
64 0
|
1月前
|
Web App开发 JavaScript 前端开发
前端工程化
前端工程化
38 4
|
2月前
|
前端开发 JavaScript Java
让我们来聊聊前端的工程化
让我们来聊聊前端的工程化
|
2月前
|
前端开发 JavaScript 开发者
深入理解前端性能优化中的Webpack Tree Shaking
【2月更文挑战第2天】在前端开发中,性能优化一直是开发者们不断追求的目标之一。而在这个过程中,Webpack Tree Shaking 技术作为一种重要的优化手段,对于减小前端应用的体积、提高加载速度起到了至关重要的作用。本文将深入探讨Webpack Tree Shaking 技术的原理和实现方式,帮助读者更好地理解并运用这一技术来优化前端应用性能。
|
2月前
|
缓存 JavaScript 前端开发
前端工程化:优化JS加载速度
在现代Web应用中,JavaScript已成为必不可少的一部分,但是随着业务复杂度的增加,JS文件的体积也越来越大,导致网页加载速度变慢,影响用户体验。本文将介绍前端工程化的优化策略,以提高JS文件的加载速度。
19 2