- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
一、写在前面commonjs
和esmodule
是目前前端主要的模块化方案,下面将具体总结一下,以及两者之间的不同之处。
二、commonjs2.1
commonjs也叫cjs,在node中每一个js文件都是一个单独的模块,这个模块中包含CommonJS的规范的核心变量: exports, module.exports, require,exports和module.exports可以负责对模块中的内容进行导出。require函数可以帮助我们导入其他模块(自定义模块,系统模块,第三方库)。
2.2、exports和module.exports之间的区别
1、每一个模块都是一个module模块,也就是module。
2、node中导出的不是exports,而是module.exports。
3、也就是说exports和module.exports本来指向的是同一个引
用地址,但是真正导入的是module.exports,所以当我们手动更改
exports = {},这样就会报错,我们只能改属性。
2.3、require的引入规则
1、如果存在核心模块(path, url)等,可以直接引入即可。
2、如果使用./x或者../x以及/x等来引入的话,首先会先找到相应目录下面的x文件,没有找x.js,x.json,x.node,还没有找到就去找./x/index.js, ./x/index.json,./x/index.node文件,如果都不存在,则报错。
3、如果为第三方库,则按照类似于这种规则进行查找。
/*
[
'D:\\web前端开发\\javascript高级\\二十五\\一、require的查找规则\\node_modules',
'D:\\web前端开发\\javascript高级\\二十五\\node_modules',
'D:\\web前端开发\\javascript高级\\node_modules',
'D:\\web前端开发\\node_modules',
'D:\\node_modules'
]
*/
4、require在进行加载模块的时候,后执行一遍里面的代码,但是当该模块中多次引入该模块,则require只会执行一次,因为存在缓存(module中存在loaded函数)。
2.5、加载顺序
//main.js
console.log('main')
require("./aaa")
require('./bbb')
//aaa.js
console.log('aaa')
require('./ccc')
//bbb.js
console.log('bbb')
require('./ccc')
require('./eee')
//ccc.js
console.log('ccc')
require('./ddd')``
//ddd.js
console.log('ddd')
require('./eee')
//eee.js
console.log('eee')
//运行结果是
main
aaa
bbb
ccc
ddd
eee
bbb
//一些包加载一次,就不会进行加载了
2.6、commonjs的缺点
1、commonjs加载是同步的,所以必须等到相应的模块加载完毕,
在会执行后续代码,在node环境中使用,没有什么问题,因为node
的js文件都是本地的。
2、如果要是在浏览器中执行,因为浏览器中都是从远程服务器上请
求到的,同步势必会引起一些卡顿。
3、但是在webpack中可以使用commonjs是因为webpack可以对其
进行打包处理。
三、esmodule3.1、基本使用
1、在浏览器上使用esmodule必须加上type = 'module'
2、必须需要开启服务器(live server)
3、在js中引入文件的时候,必须要加上'.js'.
3.2、三中导出方式
//1、第一种导出方式
export const name = 'dl'
export const age = 20
//2、第二种导出方式(集体导出)
const name = '董礼'
const age = 20
function sum(num1, num2) {
return num1 + num2
}
export { //注意:这里不是对象,这里必须这样写
name,
age,
sum
}
//三、第三种导出方式,起别名
const name = 'dl'
const age = 20
export {
name as FName,
age as FAge
}
//三种导入方式
//第一种导入方式
import {
name,
age,
sum
} from './foo.js'
//二、第二种导入方式,起别名
import { name as Fname, age as FAage } from './foo.js'
//三、第三种导入方式
import * as foo from './foo.js'
//default默认导出
const foo = 'foo value'
export default foo
//默认导出二
export {
name,
age,
foo as default
}
//import函数
//为什么要有import函数
因为在使用import xx from 'xx'的时候,不能将其写在逻辑代码中。
if(true) {
import xx from 'xxx'
}
esmodule在被js引擎解析的时候,就必须知道他的依赖关系,但是
一些请款下,我们确确实实希望动态来加载一个模块。所以我们可以
使用import()函数来实现异步加载,浏览器调用另一个线程进行下
载,然后不会阻塞js线程。import()函数返回的是一个promise
函数,所以在拿到结果的时候需要使用.then来获取相应的值,
import.meta:es11中新增的一个属性,可以拿到当前文件的url
地址。
四、两者之间的区别
4.1、commonjs是对模块的浅拷贝,esmodule是对模块的引用。
4.2、import的接口是read-only(只读状态),不能修改其变量
值。即不能修改变量的指针指向,但是可以改变变量内部的指针指
向,可以对commonjs对重新赋值,但是esmodule赋值会编译报错。
我正在一个环境中启动一个新项目,该环境对 require 模块具有 native CommonJS 支持 - 这是一个原子 shell 项目,不可能使用预编译步骤,例如在 Browserify 或 w
是否有任何标准方法可以在 CommonJS 环境中使用 Scala.js 应用程序作为库?如果没有,我可以为此目的修补生成的 js 文件吗? 最佳答案 Scala.js 0.6.13 及更高版本 把它
我正在寻找 Nashorn 的模块系统。据我所知,CommonJS 是处理 JS 模块的方法。我浏览了该列表( here 和 here ),发现 Java 的 CommonJS 实现方式很少。 Nar
背景 我有一个文件需要在两个存储库之间共享。该文件包含一个对象。 Repo A 设置为仅接受 commonjs 文件( require("/path/to/file") ),我无法轻松访问其 babe
我正在尝试使用 base58进口 buffer .我已经安装了两个: https://github.com/calvinmetcalf/rollup-plugin-node-builtins http
假设我想在我的项目(或任何给定的 npm 包)中使用 Immutable。我已经npm install编辑了它,所以它在node_modules中。当然,它有 CommonJS 导出。但是,我想在我的
我对模块化 JS 完全陌生,以前从未使用过任何模式。我正在编写一个项目,其中的代码多达 400 多行,我想通过将不同模块中的内容分开来更好地管理它。我选择使用 commonJS 模块,因为我已经使用了
在我看来,这个问题更接近commonJs,而不是titanium。我编写了一个大文件。相当丑陋(代码的第一次和平)。如果你愿意的话,你可以跳过它。 问题:我的代码中有 2 个 View ,我想将它们放
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
在 websphere 中运行 spring 的 workmanager 任务执行器时收到异常。 以下是我的代码 我的 ConcurrentWorkManager 中的代码
因此,我出于常见原因(命名空间保护和依赖项处理(需要)以及公共(public) API 定义(导出))在个人项目中使用模块。我编写了自己的 require() 方法并使用标准模块模式 - 即: var
在这种情况下,在 CommonJS 模块内声明函数是否有良好的做法: // function foo() { ... } module.exports = function () { // fu
我想知道以下是否以及如何可能: CommonJS 环境,在 Node 和/或浏览器中使用的模块(带有 Browserify )。 两个(或更多)模块,每个返回一个单例,需要在应用程序的不同部分/模块中
这是我从 Flux architecture var AppDispatcher = require('../dispatcher/AppDispatcher'); var EventEmitter
我在创建声明文件 (d.ts) 时感到困惑。 例如,我创建了一个 NPM 包“a”(一个 CommonJS 模块 index.ts): export interface IPoint { x:
我正在从事 Angular2 项目。我浏览了 Angular2 aot 文档并且能够生成 ngFactory 文件。我按照文档中的建议使用了 rollup js。我有一些非 es6 npm 包。我已经
我不时听到 CommonJS http://www.commonjs.org/是创建一组模块化 javascript 组件的努力,但坦率地说,我从来没有理解过它。 我可以在哪里使用这些模块化组件?我在
我正在使用 React、TS 和 Webpack 堆栈开发应用。 我需要实现允许我的应用程序与客户端插件一起工作的功能 - js 文件覆盖某些类的现有功能。它可以从任何地方加载 - 本地文件系统或远程
现在,我使用 CommonJS 模块在脚本中设置一些全局变量,而不是在每个脚本中手动设置它们。 index.spec.js /*globals browser, by, element*/ requi
我想知道如何从另一个需要它的模块中增加一个 commonjs 模块。 假设我有三个文件,两个 commonjs 模块,如下所示: my-example-module.js function MyExa
我是一名优秀的程序员,十分优秀!