Vue系列之十: webpack使用

简介:  Webpack是当下最热门的前端资源模块化管理和打包工具, 它可以将许多松散耦合的模块按照依赖和规则打包成符合生产环境部署的前端资源。还可以将按需加载的模块进行代码分离,等到实际需要时再异步加载。通过 loader转换, 任何形式的资源都可以当做模块, 比如Commons JS、AMD、ES 6、CSS、JSON、Coffee Script、LESS等;

10.1、什么是Webpack


本质上, webpack是一个现代JavaScript应用程序的静态模块打包器(module bundler) 。当webpack处理应用程序时, 它会递归地构建一个依赖关系图(dependency graph) , 其中包含应用程序需要的每个模块, 然后将所有这些模块打包成一个或多个bundle.

 Webpack是当下最热门的前端资源模块化管理和打包工具, 它可以将许多松散耦合的模块按照依赖和规则打包成符合生产环境部署的前端资源。还可以将按需加载的模块进行代码分离,等到实际需要时再异步加载。通过 loader转换, 任何形式的资源都可以当做模块, 比如Commons JS、AMD、ES 6、CSS、JSON、Coffee Script、LESS等;

 伴随着移动互联网的大潮, 当今越来越多的网站已经从网页模式进化到了WebApp模式。它们运行在现代浏览器里, 使用HTML 5、CSS 3、ES 6等新的技术来开发丰富的功能, 网页已经不仅仅是完成浏览器的基本需求; WebApp通常是一个SPA(单页面应用) , 每一个视图通过异步的方式加载,这导致页面初始化和使用过程中会加载越来越多的JS代码,这给前端的开发流程和资源组织带来了巨大挑战。

 前端开发和其他开发工作的主要区别,首先是前端基于多语言、多层次的编码和组织工作,其次前端产品的交付是基于浏览器的,这些资源是通过增量加载的方 式运行到浏览器端,如何在开发环境组织好这些碎片化的代码和资源,并且保证他们在浏览器端快速、优雅的加载和更新,就需要一个模块化系统,这个理想中的模 块化系统是前端工程师多年来一直探索的难题。


10.2、模块化的演进


Script标签


<scriptsrc = "module1.js"></script><scriptsrc = "module2.js"></script><scriptsrc = "module3.js"></script>


这是最原始的JavaScript文件加载方式,如果把每一个文件看做是一个模块,那么他们的接口通常是暴露在全局作用域下,也就是定义在window对象中,不同模块的调用都是一个作用域。

 这种原始的加载方式暴露了一些显而易见的弊端:


  • 全局作用域下容易造成变量冲突
  • 文件只能按照<script>的书写顺序进行加载
  • 开发人员必须主观解决模块和代码库的依赖关系
  • 在大型项目中各种资源难以管理,长期积累的问题导致代码库混乱不堪


CommonsJS


服务器端的NodeJS遵循CommonsJS规范,该规范核心思想是允许模块通过require方法来同步加载所需依赖的其它模块,然后通过exports或module.exports来导出需要暴露的接口。


require("module");
require("../module.js");
export.doStuff=function(){};
module.exports=someValue;
1234


优点:


  • 服务器端模块便于重用
  • NPM中已经有超过45万个可以使用的模块包
  • 简单易用


缺点:


  • 同步的模块加载方式不适合在浏览器环境中,同步意味着阻塞加载,浏览器资源是异步加载的
  • 不能非阻塞的并行加载多个模块


实现:


  • 服务端的NodeJS
  • •Browserify,浏览器端的CommonsJS实现,可以使用NPM的模块,但是编译打包后的文件体积较大
  • modules-webmake,类似Browserify,但不如Browserify灵活
  • wreq,Browserify的前身


AMD


Asynchronous Module Definition规范其实主要一个主要接口define(id?,dependencies?,factory);它要在声明模块的时候指定所有的依 赖dependencies,并且还要当做形参传到factory中,对于依赖的模块提前执行。


define("module",["dep1","dep2"],functian(d1,d2){
returnsomeExportedValue;
});
require(["module","../file.js"],function(module,file){});
1234


优点


  • 适合在浏览器环境中异步加载模块
  • 可以并行加载多个模块


缺点


  • 提高了开发成本,代码的阅读和书写比较困难,模块定义方式的语义不畅
  • 不符合通用的模块化思维方式,是一种妥协的实现


实现


  • RequireJS
  • curl


CMD


Commons Module Definition规范和AMD很相似,尽保持简单,并与CommonsJS和NodeJS的Modules规范保持了很大的兼容性。


define(function(require,exports,module){
var$=require("jquery");
varSpinning=require("./spinning");
exports.doSomething=...;
module.exports=...;
});


优点:


  • 依赖就近,延迟执行
  • 可以很容易在NodeJS中运行缺点
  • 依赖SPM打包,模块的加载逻辑偏重


实现


  • Sea.js
  • coolie


ES6模块


EcmaScript 6标准增加了JavaScript语言层面的模块体系定义。ES 6模块的设计思想, 是尽量静态化, 使编译时就能确定模块的依赖关系, 以及输入和输出的变量。Commons JS和AMD模块,都只能在运行时确定这些东西。


import"jquery"exportfunctiondoStuff(){}
module"localModule"{}


优点


  • 容易进行静态分析
  • 面向未来的Ecma Script标准


缺点


  • 原生浏览器端还没有实现该标准
  • 全新的命令,新版的Node JS才支持


实现


  • Babel


大家期望的模块


 系统可以兼容多种模块风格, 尽量可以利用已有的代码, 不仅仅只是JavaScript模块化, 还有CSS、图片、字体等资源也需要模块化。


10.3、安装Webpack


WebPack是一款模块加载器兼打包工具, 它能把各种资源, 如JS、JSX、ES 6、SASS、LESS、图片等都作为模块来处理和使用。

 安装:


npminstallwebpack-gnpminstallwebpack-cli-g


测试安装成功


  • webpack -v
  • webpack-cli -v


配置


创建 webpack.config.js配置文件


  • entry:入口文件, 指定Web Pack用哪个文件作为项目的入口
  • output:输出, 指定WebPack把处理完成的文件放置到指定路径
  • module:模块, 用于处理各种类型的文件
  • plugins:插件, 如:热更新、代码重用等
  • resolve:设置路径指向
  • watch:监听, 用于设置文件改动后直接打包


module.exports= {
entry:"",
output:{
path:"",
filename:""  },
module:{
loaders:[
      {test:/\.js$/,;\loade:""}
    ]
  },
plugins:{},
resolve:{},
watch:true}


直接运行webpack命令打包


10.4、使用webpack


  1. 创建项目
  2. 创建一个名为modules的目录,用于放置JS模块等资源文件
  3. 在modules下创建模块文件,如hello.js,用于编写JS模块相关代码

//暴露一个方法:sayHiexports.sayHi=function(){
document.write("<div>Hello Webpack</div>");
  }


  1. 在modules下创建一个名为main.js的入口文件,用于打包时设置entry属性


//require 导入一个模块,就可以调用这个模块中的方法了varhello=require("./hello");
hello.sayHi();


  1. 在项目目录下创建webpack.config.js配置文件,使用webpack命令打包


module.exports= {
entry:"./modules/main.js",
output:{
filename:"./js/bundle.js"  }
}


  1. 在项目目录下创建HTML页面,如index.html,导入webpack打包后的JS文件

<!doctypehtml><htmllang="en"><head><metacharset="UTF-8"><title>狂神说Java</title></head><body><scriptsrc="dist/js/bundle.js"></script></body></html>


  1. 在IDEA控制台中直接执行webpack;如果失败的话,就使用管理员权限运行即可!
  2. 运行HTML看效果


说明


# 参数--watch 用于监听变化webpack--watch


相关文章
|
2月前
|
JavaScript
webpack学习三:webpack初始化整合配置vue,一步一步的抽离代码块整合vue。
这篇文章是关于如何在webpack环境中配置Vue.js,包括安装Vue.js、解决报错、理解el与template的区别、使用SPA模式、抽离模板为对象、封装为单独的js文件、安装vue-loader时遇到的问题及解决方案,以及整个过程的总结。
86 2
webpack学习三:webpack初始化整合配置vue,一步一步的抽离代码块整合vue。
|
3月前
|
JavaScript 测试技术 Windows
vue配置webpack生产环境.env.production、测试环境.env.development(配置不同环境的打包访问地址)
本文介绍了如何使用vue-cli和webpack为Vue项目配置不同的生产和测试环境,包括修改`package.json`脚本、使用`cross-env`处理环境变量、创建不同环境的`.env`文件,并在`webpack.prod.conf.js`中使用`DefinePlugin`来应用这些环境变量。
162 2
vue配置webpack生产环境.env.production、测试环境.env.development(配置不同环境的打包访问地址)
|
4月前
|
前端开发 JavaScript API
|
4月前
|
JavaScript 前端开发 API
解锁前端开发新境界:Vue.js携手Webpack,打造高效构建流程,你的项目值得拥有!
【8月更文挑战第30天】随着前端技术的发展,模块化与组件化趋势愈发显著。Vue.js 以其简洁的 API 和灵活的组件系统,深受开发者喜爱;Webpack 则凭借强大的模块打包能力成为前端工程化的基石。两者结合,不仅简化了组件编写与引用,还通过模块热替换、代码分割等功能大幅提升开发效率。本文将通过具体示例,展示如何利用 Vue.js 和 Webpack 构建高效、有序的前端开发环境。从安装配置到实际应用,逐步解析这一组合的优势所在。
51 0
|
4月前
|
JavaScript 测试技术
在不同 webpack 版本的 Vue 项目中配置 Storybook
在不同 webpack 版本的 Vue 项目中配置 Storybook
|
4月前
|
JavaScript
VUE——filemanager-webpack-plugin报错TypeError: Cannot read property 'isFile' of undefined
VUE——filemanager-webpack-plugin报错TypeError: Cannot read property 'isFile' of undefined
88 0
|
5月前
|
JavaScript
Vue 开发中的一些问题简单记录,Cannot find module ‘webpack/lib/RuleSet‘
Vue 开发中的一些问题简单记录,Cannot find module ‘webpack/lib/RuleSet‘
350 1
|
5月前
|
JavaScript 前端开发 应用服务中间件
|
5月前
|
JavaScript
vue 配置【详解】 vue.config.js ( 含 webpack 配置 )
vue 配置【详解】 vue.config.js ( 含 webpack 配置 )
82 0
|
7月前
|
JavaScript 前端开发
构建工具:配置Webpack打包Vue项目
【4月更文挑战第24天】本文介绍了如何配置Webpack来打包Vue项目。首先,Webpack作为模块打包器处理依赖并打包成可执行文件。接着,通过安装Node.js和npm,创建Vue项目,进入项目目录并配置Webpack的入口、输出、加载器和插件。最后,运行构建命令完成打包。理解Webpack基础并按需配置,能优化前端项目构建和开发体验。
103 0