我有一个用 typescript 编写的 Express 服务器,并"module": "es2020"在其 tsconfig.xml 中。
我还es2020为我的 graphql API 开发了另一个模块,仍然是 typescript,这个模块使用 mongoose 和这样的命名导入:
import { Types } from 'mongoose'
Run Code Online (Sandbox Code Playgroud)
当我用 编译我的 graphql 模块时,一切正常tsc。但是运行的快递服务器
nodemon --watch './**/*.ts' --exec 'node --experimental-specifier-resolution=node --loader ts-node/esm' src/index.ts
无法处理名为 import 的猫鼬。
import { Types } from 'mongoose';
^^^^^
SyntaxError: Named export 'Types' not found. The requested module 'mongoose' is a CommonJS module, which may not support all module.exports as named exports.
CommonJS modules can always be imported via …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个既可以是required 又可以是imported 的库。在网上找到了不同的方法,如下:
{
"main": "mylib-cjs.js",
"module": "mylib-esm.js"
}
Run Code Online (Sandbox Code Playgroud)
和
{
"exports": {
"import": "mylib-esm.js",
"require": "mylib-cjs.js"
}
}
Run Code Online (Sandbox Code Playgroud)
这两种方法的优点和缺点是什么,它们有何不同?
我将开发一个协作网站,其中一个功能将是实时更改的协作编辑.即,当两个或更多用户正在编辑同一个文档时,他们可以在发生时立即看到彼此的变化.我对Ruby on Rails有一些经验,所以我在考虑使用EventMachine,但是围绕Node.js的所有这些炒作,我知道考虑使用它.那么,使用Node.js而不是EventMachine的主要好处是什么?
tl; dr EventMachine和Node.js之间的主要区别是什么(除了语言)?
我想创建模块来构建我的NodeJS应用程序,但我有点迷失,而且我还没有找到任何关于这个主题的完全确定的东西(有几个小时的搜索).
假设我想创建一个"用户"模块,我可以使用以下内容在我的代码中创建新用户:
var newUser = new User();
Run Code Online (Sandbox Code Playgroud)
理想情况下,我需要使用以下代码之类的代码顶部的模块:
var User = require('../lib/user');
Run Code Online (Sandbox Code Playgroud)
这非常有效.问题是,我应该如何构建用户模块?以下是最好的方法吗?
module.exports = function User() {
var authorized = false;
var username = undefined;
var password = undefined;
var statistics = undefined;
this.authorized = function() {
return authorized;
}
this.username = function() {
return username;
}
this.statistics = function() {
return statistics;
}
}
Run Code Online (Sandbox Code Playgroud)
我正在为各种模块变量编写getter和setter,允许我隐藏我不想从其他代码中意外访问的内容.但是,我之前这样做过:
function User() {
this.authStatus = false;
this.email;
this.displayName;
this.inSession;
}
User.prototype.isAuthenticated = function() {
return(this.authStatus && this.email && this.displayName)
}
User.prototype.isInSession = function() …Run Code Online (Sandbox Code Playgroud) 我一直在通过Webpack教程.在其中一个部分中,它给出了代码示例,其中包含一行本质问题:
export default class Button { /* class code here */ }
Run Code Online (Sandbox Code Playgroud)
在所述教程的下一部分,标题为"代码分割",上面定义的类是按需加载的,如下所示:
require.ensure([], () => {
const Button = require("./Components/Button");
const button = new Button("google.com");
// ...
});
Run Code Online (Sandbox Code Playgroud)
不幸的是,此代码抛出异常:
Uncaught TypeError: Button is not a function
Run Code Online (Sandbox Code Playgroud)
现在,我知道包含ES6模块的正确方法是简单地import Button from './Components/Button';在文件的顶部,但是在文件中的任何其他地方使用类似的构造会让babel成为一个悲伤的熊猫:
SyntaxError: index.js: 'import' and 'export' may only appear at the top level
Run Code Online (Sandbox Code Playgroud)
在require.ensure()上面的上一个()示例的一些摆弄之后,我意识到ES6 export default语法导出一个具有名为property的对象,该对象default包含我的代码(Button函数).
我通过.default在require调用后附加来修复损坏的代码示例,如下所示:
const Button = require("./Components/Button").default;
Run Code Online (Sandbox Code Playgroud)
...但我认为它看起来有点笨拙并且容易出错(我必须知道哪个模块使用ES6语法,哪个使用旧版本module.exports).
这让我 …
当前的 Javascript 采用importES6 作为导入模块的标准方式。但是,我有时会看到使用 CommonJSrequire而不是import.
我首先想知道两个是否可以一起使用,但似乎两个不能互换。(相关的stackoverflow问题)
那么,CommonJS“需要”的东西还在项目中使用吗?或者它正在慢慢消亡并且仅需要维护遗留代码?
在github上查看代码时,我发现了以下内容:
(function() {
}).call(this);
Run Code Online (Sandbox Code Playgroud)
这显然是一个自我调用的匿名函数.但为什么这样写呢?我习惯于看到规范的变体(function() {})().
使用.call(this)自动调用匿名函数有什么特别的优势吗?
编辑:看起来某些commonjs环境this在模块的顶层设置为非全局值.哪些,以及它们this可能想要保留的内容是什么?
所以,我正在使用RequireJS和React,尝试加载第三方组件,该组件已安装:
npm install react-autocomplete
Run Code Online (Sandbox Code Playgroud)
结构在这里:https://github.com/rackt/react-autocomplete/tree/master/lib
现在,我有一个main.js文件,在加载requireJS时启动,如下所示:
require.config({
paths: {
"react" : "react/react",
"jsx-transformer" : "react/JSXTransformer",
"react-autocomplete" : "node_modules/react-autocomplete/lib/main"
}
});
require(["react"], function(react) {
console.log("React loaded OK.");
});
require(["jsx-transformer"], function(jsx) {
console.log("JSX transformer loaded OK.");
});
require(['react-autocomplete'], function (Autocomplete) {
console.log("React autocomplete component loaded OK.");
var Combobox = Autocomplete.Combobox;
var ComboboxOption = Autocomplete.Option;
console.log("Autocomplete initiated OK");
});
Run Code Online (Sandbox Code Playgroud)
现在,它都加载正常,但第三个require语句为第三方组件中的main.js文件抛出"模块未定义",如下所示:
module.exports = {
Combobox: require('./combobox'),
Option: require('./option')
};
Run Code Online (Sandbox Code Playgroud)
我一直在阅读这与我试图要求一个CommonJS风格的模块有关,但我无法弄清楚如何自己修复它,因为我是新手.
有没有人有一个明确的例子,我怎么能解决这个问题?
比方说,我们有四个模块A,B,C和D
在模块中A:
console.log("A evaluated")
function AClass {
console.log("A constructor")
}
var aObj = new AClass()
export default aObj;
Run Code Online (Sandbox Code Playgroud)
在模块中B:
import aObj from A
export default "B"
Run Code Online (Sandbox Code Playgroud)
在模块中C:
import aObj from A
export default "C"
Run Code Online (Sandbox Code Playgroud)
在模块中D:
import b from B
import c from C
import aObj from A
Run Code Online (Sandbox Code Playgroud)
因此,当模块D进行评估,多少次将A evaluated与A constructor被打印到控制台上?
这种行为是否在ES6标准中描述?如果我想要仅对一个模块进行评估,无论直接或间接导入多少次,我该怎么办?有没有人对此有任何想法?
我按照这里的说明操作:https://www.npmjs.org/package/grunt-browserify,尝试在grunt上设置browserify的源映射.我的gruntfile中的browserify选项是:
browserify: {
options: {
bundleOptions : {
debug: true
}
},
dist: {
files: {
"public/client.bundle.js": ["bundle.js"]
}
}
}
Run Code Online (Sandbox Code Playgroud)
bundle.js的生成没有任何问题,但源映射生成不会发生.我的grunt-browserify选项有什么问题吗?
谢谢你的期待.
commonjs ×10
javascript ×9
node.js ×4
ecmascript-6 ×2
webpack ×2
browserify ×1
closures ×1
coffeescript ×1
es6-modules ×1
event-driven ×1
eventmachine ×1
gruntjs ×1
import ×1
module ×1
mongoose ×1
reactjs ×1
require ×1
requirejs ×1
typescript ×1