Webpack 原理与实践之如何使用 Webpack 实现模块化打包?
本文转载自微信公众号「前端万有引力」,原用作者一川。理实转载本文请联系前端万有引力公众号。何使化打
写在前面
我们知道当前生产中主流的实现模块化打包工具有Webpack、Parcel和Rollup。模块作为模块化打包工具,原用它们基本的理实特点有:
能够将散落的模块打包在一起 能够编译转换代码中的新特性,使得可以兼容各种生产环境对于主流的何使化打webpack而言,webpack作为一个模块打包工具,实现自身就可以实现模块化代码打包的模块问题,通过webpack可以将零散的原用JS代码打包到一个JS文件中。对于有环境兼容性问题的理实代码,webpack可以在代码打包过程中通过loader机制对其实现编译转换,何使化打然后再进行打包。实现对于不同类型的模块前端模块,webpack支持在js中以模块化的方式载入任意类型的资源文件,例如:可以通过webpack实现在JS中加载CSS文件,被加载的CSS文件会以style标签的方式工具。
webpack还具备代码拆分的能力,能够将应用中所有的网站模板模块按需分块打包,不用担心全部代码打包到一起,产生单个文件过大,导致加载慢的问题。这种模块按需分块打包非常适合大型web项目。
Webpack上路
Webpack作为主流的前端模块打包器,提供了一整套前端项目模块化方案,而不仅仅局限于JS的模块化,可以实现对前端项目开发过程中涉及到的资源进行模块化。
我们知道ES Modules中制定的html中使用script导入js模块,需要设定type="module",用来区分加载的是普通JS脚本还是一个模块。对于支持ES Modules的浏览器可以直接使用,但是对于不支持的浏览器就会报错,因此需要使用webpack模块打包工具避免报错。
<script src="./index.js" type="module"></script> // heading.js export default function(){ const element = document.createElement("div"); element.textContent = "hello yichuan"; element.addEventListener("click",()=>{ console.log("hello onechuan"); return element }) } // index.js import createHeader from "./heading.js"; document.body.append(createHeader())对于,我们需要先安装webpack的核心模块和cli程序,用于在命令行中调用webpack。npx是npm5.2以后新增的一个命令,服务器托管可以更方便地执行远程模块或者项目node_modules中的cli程序。
$ npm init --yes $ npm i webpack webpack-cli -D $ npx webpack --version $ npx webpack通过执行npx webpack实现自动化打包,webpack会默认从src/index.js文件开始打包,打包完毕后会在根目录下生产dist目录,所有打包文件会在dist目录。
|--dist |--main.js (()=>{ "use strict";document.body.append(function(){ const e=document.createElement("div");e.textContent="hello yichuan",e.addEventListener("click",(()=>(console.log("hello onechuan"),e)))}())})();webpack4.0以后的版本支持零配置的方式直接启动打包,整个过程会按照约定将src/index.js文件作为打包入口,最终打包的结果会存放到dis/main.js中。但是,很多时候webpack的默认规则并能满足我们实际需求,对此我们需要对webpack进行自定义配置。
webpack支持在项目中创建webpack.config.js文件进行自定义打包配置,由于webpack是运行在node.js环境,对应应该遵守CommonJS规则进行导入导出。
|--backpack |--src |--heading.js |--main.js |--index.html |--package.json |--webpack.config.js-------webpack配置文件webpack自定义的配置文件:
// webpack.config.js const path = require("path"); module.exports = { entry:"./src/index.js",//打包入口 output:{ //打包出口 filename:"bundle.js",//命名打包后的文件 path:path.join(__dirname,"output") }, // 打包模式 mode:"none" }执行打包命令后会在项目根目录下自动生成打包后的文件目录,我们看到下面是执行打包命令后生成的文件,生成的是一个立即执行函数。