以vue2.0为例html
在咱们执行npm run dev
时,会看到package.json
中,有vue
"dev": "rollup -w -c scripts/config.js --environment TARGET:web-full-dev"
复制代码
根据 scripts/config.js
文件中的配置:node
// Runtime+compiler development build (Browser)
'web-full-dev': {
entry: resolve('web/entry-runtime-with-compiler.js'),
dest: resolve('dist/vue.js'),
format: 'umd',
env: 'development',
alias: { he: './entity-decoder' },
banner
}
复制代码
这里注意到format
参数的值为umd
,git
注意看这个文件,在builds
对象中还有github
// Runtime+compiler CommonJS build (CommonJS)
'web-full-cjs': {
entry: resolve('web/entry-runtime-with-compiler.js'),
dest: resolve('dist/vue.common.js'),
format: 'cjs',
alias: { he: './entity-decoder' },
banner
},
// Runtime+compiler CommonJS build (ES Modules)
'web-full-esm': {
entry: resolve('web/entry-runtime-with-compiler.js'),
dest: resolve('dist/vue.esm.js'),
format: 'es',
alias: { he: './entity-decoder' },
banner
},
// Runtime+compiler development build (Browser)
'web-full-dev': {
entry: resolve('web/entry-runtime-with-compiler.js'),
dest: resolve('dist/vue.js'),
format: 'umd',
env: 'development',
alias: { he: './entity-decoder' },
banner
},
复制代码
咱们看到三种模块: CommonJS
、ES Modules
和umd
web
接下来,咱们来学习下经常使用的模块:express
经常使用的Node即是采用 CommonJS 模块规范。每一个文件就是一个模块,有本身的做用域。npm
在服务器端,模块的加载是运行时同步加载的;编程
在浏览器端,模块须要提早编译打包处理。json
咱们一块儿来看一看CommonJS的例子:
// example.js
var x = 5;
var addX = function (value) {
return value + x;
};
module.exports.x = x;
exports.addX = addX;
//index.js
const example = require('./example.js')
console.log(example.x); // 5
console.log(example.addX(1)); // 6
example.x = 6
console.log(example.addX(1)); // 6
执行node index.js
复制代码
暴露模块:module.exports = value 或 exports.xxx = value
引入模块:require(xxx),若是是第三方模块,xxx为模块名,如require('express');若是是自定义模块,xxx为模块文件路径,如上例,require('./example.js')
引入的是暴露值的拷贝,因此要注意:
// example.js
var x = {
name: 'kitty'
};
var outputX = function (value) {
return x;
};
module.exports= {
x,
outputX
}
// index.js
const example = require('./example.js')
console.log(example.x); // { name: 'kitty' }
console.log(example.outputX()); // { name: 'kitty' }
example.x.name = 'cat'
console.log(example.x); // { name: 'cat' }
console.log(example.outputX()); //{ name: 'cat' }
执行node index.js
复制代码
JS的拷贝是什么?能够查看个人JS开发者应懂的33个概念系列--原始类型2 && 值类型和引用类型3寻找答案!!!
// example.js 如上
// example2.js
module.exports = function() {
console.log('example2')
}
// index.js
const example = require('./example.js')
const example2 = require('./example2.js')
example2();
console.log(example.x);
// index.html
<html>
<body>
<script src="./index.js"></script>
</body>
<html>
复制代码
直接启动index.html
, 打开控制台,会发现:
上面说了,模块须要提早编译打包处理。 这里咱们用browerify打包一下
// 全局安装
npm install browserify -g
// 根目录下运行
browserify index.js -o bundle.js
// index.html替换script引用地址
<html>
<body>
<script src="./bundle.js"></script>
</body>
<html>
复制代码
能够看一看打包事后的bundle.js
直接启动index.html
, 打开控制台,会发现,哈哈,你成功了!!!
ES6 模块的设计思想是尽可能的静态化,使得编译时就能肯定模块的依赖关系,以及输入和输出的变量。CommonJS 和 AMD 模块,都只能在运行时肯定这些东西。好比,CommonJS 模块就是对象,输入时必须查找对象属性。
是否是感受似懂非懂,没有关系,咱们就是例子为王。
暴露模块:export命令用于规定模块的对外接口,好比export xxx
, xxx是一个对象;或者指定默认输出,用到export default命令,好比export default xxx
。
引入模块:import命令用于引入其余模块提供的功能。好比import xxx from **
,其中xxx是要加载的变量名或函数名;指定默认输出时,xxx能够为匿名函数指定的任意名字。
CommonJS引入的是暴露值的拷贝,而ES6是对值的引用。
// example.js
export let x = 5;
export function addX () {
return x++;
};
//index.js
import { x, addX } from './example.js'
console.log(x); // 5
addX()
console.log(x); // 6
复制代码
执行node index.js
,怎么回事?
SyntaxError: Unexpected token import
复制代码
这是由于node还没有支持ES6的module方式,因此咱们须要babel-cli进行将ES6编译为ES5代码。
example.js -> src/example.js
index.js -> src/index.js
复制代码
2.全局安装babel-cli
npm install babel-cli -g
3.定义.babelrc
文件
{
"presets": ["es2015"]
}
复制代码
4.使用ES6编译为ES5代码:
babel src -d lib
复制代码
node index.js
,就能够输出结果了。// index.html
<html>
<body>
<script src="./lib/index.js"></script>
</body>
<html>
复制代码
有报错了,可是是否是看起来很熟悉呢?
是的!
模块须要提早编译打包处理。
你知道怎么作了?
答对了!
// 全局安装
npm install browserify -g
// 根目录下运行
browserify lib/index.js -o bundle.js
// index.html替换script引用地址
<html>
<body>
<script src="./bundle.js"></script>
</body>
<html>
复制代码
固然能够看看lib文件夹中的ES6转换ES5代码以及打包事后的bundle.js,这里就不说了。 直接启动index.html, 打开控制台,会发现,哈哈,你成功了!!!
UMD (Universal Module Definition), 但愿提供一个先后端跨平台的解决方案(支持AMD与CommonJS模块方式)。
CommonJS加载模块是同步的,Node.js主要用于服务器编程,模块文件通常已经存在于本地磁盘,因此加载起来比较快,因此CommonJS规范比较适用;
而AMD是非同步加载模块,容许指定回调函数,在浏览器环境下,要从服务器加载模块,这时就必须采用非同步模式,所以浏览器通常采用的是AMD规范。
暴露模块:
define([有依赖模块,无依赖能够省略],
function() {
return 模块
})
复制代码
引入模块:
require([依赖模块],callback)
复制代码
RequireJS是一个工具库,主要用于客户端的模块管理。它的模块管理遵照AMD规范,RequireJS的基本思想是,经过define
方法,将代码定义为模块;经过require
方法,实现代码的模块加载。
// example.js
define(function (){
var add = function (x,y){
return x+y;
}
return {
add
}
}
// index.js
(function () {
require.config({
paths: {
example: './example' // 不能写example.js会报错
}
})
require(['example'], function(example) {
console.log(example.add(2, 2))
})
})()
// require.js
复制这个
https://requirejs.org/docs/release/2.3.6/minified/require.js的代码
// index.html
<html>
<body>
<script data-main="./index.js" src="./require.js"></script>
</body>
<html>
复制代码
直接启动index.html, 打开控制台,会发现,哈哈,你成功了!!!
打开控制台network,看到分步加载
./dist/vue.runtime.js