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 ...
随机推荐
- 关于UTF8文件带BOM头可能会引起的错误解析
今天在做一个文件上传的项目中碰到了一个十分奇怪的问题,在解析上传上来的csv文件时,总是在解析第一行的第一个标题字段时出错,就是第一个那个字段总是和对应的model字段对应不上,这个坑是真的很深,找了 ...
- BeautifulSoup 抓取网站url
1 # -*- coding:utf-8 -*- 2 import urlparse 3 import urllib2 4 from bs4 import BeautifulSoup 5 6 url ...
- 以通配符(%)开始的like字符串,走索引
在对oracle的SQL优化过程中经常会遇到[like'%abc']破坏索引的问题,但是如果真有此类需求,该如何在不破坏索引的基础上进行查询呢. [sql] view plain copy sys@m ...
- Intellij 解除(去除)SVN关联
方法一:通过Intellj 来处理 1. 安装插件 打开Intellij的setting(ctrl+alt+s),选择plugins,在右边搜索框输入"SVN",搜索.选择&quo ...
- redis集群配置,spring整合jedis,缓存同步
前台的商品数据(图片等加载缓慢)查询,先从redis缓存查询数据. redis是一个nosql数据库,内存版数据库,读取速度11w/s.本身具有内存淘汰机制,是单线程服务器(分时操作系统),线程安全. ...
- 一次对象过大引起的gc性能问题的分析与定位
现象:一个接口在4C的机器上跑最大只有7TPS,CPU使用率就已经90%多. 定位: 1. 使用top命令查看CPU使用情况,找到进程号 2. 使用top -H -pid命令,查看进程信息,看到有 ...
- for循环语句以及输出语句
action() { int i; //定义变量 lr_start_transaction("submit_answer"); //开始事物 for(i=0; i ...
- 简述ES6其他的东西
第一是修饰器是ES7的一个提案,现在Babel转码器已经支持.那么什么是修饰器呢,修饰器是对类的行为的改变,在代码编译时发生的,而不是在运行时发生的且修饰器只能用于类和类的方法.修饰器可以接受三个函数 ...
- C C语言中关键词,以及知识点复习
C语言学习 C语言练习知识点 auto 局部变量(自动储存) break 无条件退出程序最内层循环 case switch语句中选择项 char ...
- CDH的安装
环境5台装有centos 6.9系统的服务器 1.网络配置 sudo vi /etc/sysconfig/network修改hostname: NETWORKING=yes HOSTNAME=ZXXS ...