from Require.js to Webpack(why)
写在前面:
本文主要参考 From Require.js to Webpack - Part 1 (the reasons),原文作者将项目从 require.js 转移到了 webpack 并详细说明了原因以及好处。
- commonjs (webpack 默认 commonjs,很显然,commonjs 同步书写 js 的方式比 AMD 舒服很多)
- 客户端单元测试(node 具有丰富的测试框架,webpack 使得客户端测试也可以使用这些框架)
- 模块复用(node 和客户端的模块复用)
- NPM(天然支持 NPM,因为 NPM 本身发布的就是 commonjs 模块)
- 更简单的 ES6 支持以及更多的插件支持(比如 webpack 自带的 uglify 等等)
诚然,作者只是从模块组织方式去对比,并没有牵扯到构建工具这块。而如果说到构建工具,webpack 可能还有更多其他的优势,比如热重载,打包时间大大缩短,css 打包,等等,这些应该和 gulp 等去比较。
尽管 webpack 本身也支持 AMD,但是总觉得 webpack+AMD 有点 Vue/React+JQ 的既视感,而且也不能很好地结合 NPM 使用,所以个人觉得如果要迁移,还是要迁移地彻底一点,毕竟 AMD 的支持只会越来越少。
Webpack has been a huge help to our client-side code base and developer experience in general. It's allowed greater parity and reuse between our client-side and node code, it's made testing our code much easier and it's allowed us to cut way down on the config and extra support code needed to maintain two different module systems in the same code base. The most important thing it has provided though is access to the NPM ecosystem in the browser. Coding will never be the same again :)
CommonJS
Node 用习惯后,我们便会爱上它的 commonjs 的组织方式。使用 webpack 后,我们便可以使用所有的 node 模块,这简直太酷了!很显然,越来越多的模块会支持 commonjs 但是却并没有兼容 AMD。
在这点上 require.js 和 webpack 的区别是(也是 AMD 和 commonjs 的区别):
- 前者使用 return,后者使用 module.export
- webpack 用
.
代表相对路径, 作用和path.resolve()
类似 - webpack 可以方便搭配 NPM 使用
客户端单元测试
让 mocha 支持 require.js 非常费力,但是如果使用 webpack 就不一样了。只要代码没有基于 DOM,就可以被当作普通的 node 模块一样进行单元测试。
复用和模块化
复用和模块化,AMD 也有啊?有什么不同呢?
- node 本身就是 commonjs 方式进行代码组织,这就意味着我们可以把写 node 时的一些最佳实践,设计模式等无缝迁移到客户端代码的书写中。
- 我们可以把服务端的一些 commonjs 模块直接用到 客户端,而不是需要改造成 AMD(比如 date/time formatting 以及一些工具模块)
NPM
尽管 commonjs 语法本身比 AMD 优雅,并且还有以上的各种好处,但是迁移到 webpack 最大的好处是对于 NPM 的支持。尽管 require.js 本质上也能够搭配 NPM 使用,但是非常麻烦。
NPM 搭配 require.js:
- 需要暴露 node_modules 文件夹路径(commonjs 会自动去寻找 node_modules,但是 AMD 不会)
- 需要在配置文件 config.js 中为模块添加 alias(因为 npm install 的模块内部是 commonjs 的组织方式,如果直接 require 并不能找到,需要设置 alias)
- 确定你 install 的模块本身没有依赖(因为依赖本身并不会生效)
- define('your-module', function(yourModule) { });
而 NPM 搭配 webpack 只需要:
- require() the module.
成熟的 ES6 以及插件支持
webpack 对于 ES6 的支持(babel-loader)以及一些内置的插件支持(uglify)比 require.js 强大。
作者在原文举了个简单的例子,他想在 require.js 中使用 ES6 Class,但是需要两步,首先需要 babel 将 ES6 转为 ES5,然后再使用 es6 require.js plugin,但是用 babel-loader 就方便多了。
from Require.js to Webpack(why)的更多相关文章
- vue-cli的webpack模版,相关配置文件dev-server.js与webpack.config.js配置解析
1.下载vue-cli npm install vue-cli -g vue-cli的使用与详细介绍,可以到github上获取https://github.com/vuejs/vue-cli 2.安装 ...
- Vue.js中用webpack合并打包多个组件并实现按需加载
对于现在前端插件的频繁更新,所以多多少少要对组件化有点了解,下面这篇文章主要给大家介绍了在Vue.js中用webpack合并打包多个组件并实现按需加载的相关资料,需要的朋友可以参考下. 前言 随着 ...
- 使用模块化工具打包自己开发的JS库(webpack/rollup)对比总结
打包JS库demo项目地址:https://github.com/BothEyes1993/bes-jstools 背景 最近有个需求,需要为小程序写一个SDK,监控小程序的后台接口调用和页面报错(类 ...
- Vue.js - Day5 - Webpack
在网页中会引用哪些常见的静态资源? JS .js .jsx .coffee .ts(TypeScript 类 C# 语言) CSS .css .less .sass .scss Images .jpg ...
- 模块化 require.js 入门教学(前端必看系列)
在工作的时候总是会用到模块化开发,那接下来我就顺着这个问题来说一下什么是模块化 前端模块化 !!! JS 模块化提供给我们三种规范 分别就是 No.1 commonjs 这个其实也就代表了node. ...
- javascript基础修炼(12)——手把手教你造一个简易的require.js
目录 一. 概述 二. require.js 2.1 基本用法 2.2 细说API设计 三. 造轮子 3.1 模块加载执行的步骤 3.2 代码框架 3.3 关键函数的代码实现 示例代码托管在我的代码仓 ...
- Day02_Vue.js与Webpack
Vue.js与Webpack 1 vue.js介绍 1.vue.js是什么? Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设 ...
- Javascript模块化编程(三):require.js的用法
Javascript模块化编程(三):require.js的用法 原文地址:http://www.ruanyifeng.com/blog/2012/11/require_js.html 作者: 阮一峰 ...
- javascript模块化编程(三):require.js用法
本文来自阮一峰 这个系列的第一部分和第二部分,介绍了Javascript模块原型和理论概念,今天介绍如何将它们用于实战. 我采用的是一个非常流行的库require.js. 一.为什么要用require ...
随机推荐
- OVS 总体架构、源码结构及数据流程全面解析
在前文「从 Bridge 到 OVS」中,我们已经对 OVS 进行了一番探索.本文决定从 OVS 的整体架构到各个组件都进行一个详细的介绍. OVS 架构 OVS 是产品级的虚拟交换机,大量应用在生产 ...
- linux 磁盘管理三部曲——(1)磁盘结构,认识分区
最近小编整理了磁盘管理的相关知识,发现还是挺多的,所有就分了三个部分来给大家分享一下: 1.磁盘结构,认识分区 2.管理分区,文件系统格式化 3.mount挂载,/etc/fstab配置文件 这篇就先 ...
- spring -boot s-tarter 详解
Starter POMs是可以包含到应用中的一个方便的依赖关系描述符集合.你可以获取所有Spring及相关技术的一站式服务,而不需要翻阅示例代码,拷贝粘贴大量的依赖描述符.例如,如果你想使用Sprin ...
- git忽略文件
.gitignore文件配置 ###################### # Project Specific ###################### /src/main/webapp/dis ...
- Java SpringMVC 定时任务
1.web.xml 2.spring-mvc.xml <?xml version="1.0" encoding="UTF-8"?> <bean ...
- 什么是JWT(JSON WEB TOKEN)
转自于:http://www.jianshu.com/p/576dbf44b2ae 什么是JWT Json web token(JWT)是为了网络应用环境间传递声明而执行的一种基于JSON的开发标准( ...
- 【ANT】一个简单的ANT生成文件build.xml
<?xml version="1.0" ?> <project default="test"> <target name=&quo ...
- loadrunner设置分压机 压力测试
压力机设置分压机使用场景: 当本地主机内存较小,运行速度较慢,压力较大等多种需求场景下,可以使用分压机. 一.将另一台机器设置为压力机 1,开始菜单找到HP LoadRunner-->Advan ...
- iOS iOS10 的适配问题
其他:Xcode8 iOS10 的新特性 1.系统判断方法失效:2.隐私数据的访问问题:3.UIColor 问题4.真彩色的显示5.ATS问题6.UIStatusBar问题7.UITextField8 ...
- 将Maven的Web项目部署到windows的Tomcat里
这里我用的是win7和tomcat8,且tomcat8下载的是压缩包而非安装文件. 第一步:先将tomcat8安装服务,cmd里更改目录为tomcat8(即压缩包解压后的那个文件夹)的bin文件夹, ...