写在前面:

本文主要参考 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 的区别):

  1. 前者使用 return,后者使用 module.export
  2. webpack 用 . 代表相对路径, 作用和 path.resolve() 类似
  3. webpack 可以方便搭配 NPM 使用

客户端单元测试

让 mocha 支持 require.js 非常费力,但是如果使用 webpack 就不一样了。只要代码没有基于 DOM,就可以被当作普通的 node 模块一样进行单元测试。

复用和模块化

复用和模块化,AMD 也有啊?有什么不同呢?

  1. node 本身就是 commonjs 方式进行代码组织,这就意味着我们可以把写 node 时的一些最佳实践,设计模式等无缝迁移到客户端代码的书写中。
  2. 我们可以把服务端的一些 commonjs 模块直接用到 客户端,而不是需要改造成 AMD(比如 date/time formatting 以及一些工具模块)

NPM

尽管 commonjs 语法本身比 AMD 优雅,并且还有以上的各种好处,但是迁移到 webpack 最大的好处是对于 NPM 的支持。尽管 require.js 本质上也能够搭配 NPM 使用,但是非常麻烦。

NPM 搭配 require.js:

  1. 需要暴露 node_modules 文件夹路径(commonjs 会自动去寻找 node_modules,但是 AMD 不会)
  2. 需要在配置文件 config.js 中为模块添加 alias(因为 npm install 的模块内部是 commonjs 的组织方式,如果直接 require 并不能找到,需要设置 alias)
  3. 确定你 install 的模块本身没有依赖(因为依赖本身并不会生效)
  4. define('your-module', function(yourModule) { });

而 NPM 搭配 webpack 只需要:

  1. 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)的更多相关文章

  1. 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.安装 ...

  2. Vue.js中用webpack合并打包多个组件并实现按需加载

    对于现在前端插件的频繁更新,所以多多少少要对组件化有点了解,下面这篇文章主要给大家介绍了在Vue.js中用webpack合并打包多个组件并实现按需加载的相关资料,需要的朋友可以参考下.   前言 随着 ...

  3. 使用模块化工具打包自己开发的JS库(webpack/rollup)对比总结

    打包JS库demo项目地址:https://github.com/BothEyes1993/bes-jstools 背景 最近有个需求,需要为小程序写一个SDK,监控小程序的后台接口调用和页面报错(类 ...

  4. Vue.js - Day5 - Webpack

    在网页中会引用哪些常见的静态资源? JS .js .jsx .coffee .ts(TypeScript 类 C# 语言) CSS .css .less .sass .scss Images .jpg ...

  5. 模块化 require.js 入门教学(前端必看系列)

    在工作的时候总是会用到模块化开发,那接下来我就顺着这个问题来说一下什么是模块化 前端模块化 !!! JS 模块化提供给我们三种规范 分别就是 No.1 commonjs  这个其实也就代表了node. ...

  6. javascript基础修炼(12)——手把手教你造一个简易的require.js

    目录 一. 概述 二. require.js 2.1 基本用法 2.2 细说API设计 三. 造轮子 3.1 模块加载执行的步骤 3.2 代码框架 3.3 关键函数的代码实现 示例代码托管在我的代码仓 ...

  7. Day02_Vue.js与Webpack

    Vue.js与Webpack 1 vue.js介绍 1.vue.js是什么? Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设 ...

  8. Javascript模块化编程(三):require.js的用法

    Javascript模块化编程(三):require.js的用法 原文地址:http://www.ruanyifeng.com/blog/2012/11/require_js.html 作者: 阮一峰 ...

  9. javascript模块化编程(三):require.js用法

    本文来自阮一峰 这个系列的第一部分和第二部分,介绍了Javascript模块原型和理论概念,今天介绍如何将它们用于实战. 我采用的是一个非常流行的库require.js. 一.为什么要用require ...

随机推荐

  1. gunicorn Arbiter 源码解析

    如前文所述,Arbiter是gunicorn master进程的核心.Arbiter主要负责管理worker进程,包括启动.监控.杀掉Worker进程:同时,Arbiter在某些信号发生的时候还可以热 ...

  2. 其他函数:值为NULL时的默认值NVL,DECODE

    NVL(列,默认数字值),此函数返回值为数值型,非NULL时返回原始值,NULL时返回默认数字值. DECODE:

  3. lesson - 1 aming

    一.  Linux是什么* 关于Linux历史(http://www.aminglinux.com/bbs/thread-6568-1-1.html  需要大家查查资了解,也可以看看5期的视频)* 发 ...

  4. django2 快速安装指南

    django2 快速安装指南 1. 安装 作为一个 Python Web 框架,Django需要Python的支持.请参阅 我可以在Django中使用哪些Python版本?了解详情.Python包含一 ...

  5. pycharm2017.3专业版激活注册码

    pycharm作为一个不错的python编程的ide很有用处 这里拔出一段专业版的注册码,社区版用起来确实着实让人着急. 2017-12-1921:40:38 EB101IWSWD-eyJsaWNlb ...

  6. php array_walk

    PHP array_walk() 函数 对数组中的每个元素应用用户自定义函数: <?php function myfunction($value,$key) { echo "The k ...

  7. IIS加载JSON文件 错误 404

    问题描述 在发布项目的时候,有一些文件是json文件,在网页中进行加载,但是在IIS7发布的时候,json文件居然是404,无法找到,在URL上输入地址也一样. 错误原因 IIS内部机制,不支持直接访 ...

  8. Python学习_02_数字和运算

    python具有强大的科学运算功能,python由于支持更加强大的面向对象和动态特性,相比R语言.matlab.mathmatic等传统的科学计算工具具有非常大的优势. Python的数字 pytho ...

  9. 一个超级简单的demo带你走进redux的大坑

    先上代码 import React, { Component } from 'react'; import ReactDOM from 'react-dom'; import { createStor ...

  10. Life in Changsha College-第一次冲刺

    第一次冲刺任务 基于大局的全面性功能框架定位,要求能实现用户基于自己的需求进行的一系列操作. 用户故事 用户打开"生活在长大"的界面 程序首页展示校园服务,论坛等相关信息 用户选择 ...