Open MJingv opened 5 years ago
HTML 网页中,浏览器通过<script>
标签加载 JavaScript 脚本
defer是“渲染完再执行”,async是“下载完就执行”。defer按页面出现的顺序加载,async脚本是不能保证加载顺序的。
module加载
<script type="module" src="./foo.js" defer></script>
值的拷贝
,ES6 模块输出的是值的引用
。运行时加载
,ES6 模块是编译时输出
接口。对象
(即module.exports属性),该对象只有在脚本运行完才会生成。而 ES6 模块不是对象,它的对外接口只是一种静态定义
,在代码静态解析阶段就会生成。.mjs
后缀文件名node_modules
目录寻找这个模块异步加载
,这一点与浏览器的处理方法相同undefined
;CommonJS 模块的顶层this指向当前模块
以下这些顶层变量在 ES6 模块之中都是不存在的
arguments
require
module
exports
__filename
__dirname
https://www.ruanyifeng.com/blog/2020/08/how-nodejs-use-es6-module.html
AMD -
异步
(浏览器)CJS -
同步
(服务器)module.exports = xx;
const a = require('./a');
rules
输入的是被输出的值的拷贝
模块就是对象
,输入时必须查找对象属性require
对象
。如果没有发现指定模块,会报错函数
,那就不能定义在exports对象上面,而要定义在module.exports变量上面。ES6 Module
静态化
,使得编译时就能确定模块的依赖关系
,以及输入
和输出
的变量通过export命令显式指定输出的代码
,再通过import命令输入不是对象
NPM
dependencies
These packages are required by your application in
production
.npm install <package_name> --save
devDependencies
These packages are
only
needed for development and testing.npm install <package_name> --save-dev
Command Line Flags
Putting --foo bar on the command line sets the foo configuration parameter to "bar".