- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
尽管这里讨论的是 VueJS。我怀疑它也适用于任何其他 JavaScript 语言,例如 Angular 或 React。
我一直在学习 Vue.js 并热爱它。知道我有一个更大的应用程序,而且我想开始使用 TypeScript。现在似乎是时候这样做了。此时我对 Vue 有了牢固的了解,但找不到任何关于如何设置 TS 并实际运行它的文档(超过 2 周的时间找到确切的最低要求)。
这是一些 HTML 和 Vue 代码的示例,仅使用脚本标签和普通 JavaScript。
HTML
<div id="app">
<h4>{{ Value }}</h4>
</div>
@section Scripts {
<script src="~/lib/vue/vue.js"></script>
<script src="~/js/test.js"></script>
}
JavaScript - test.js
var app = new Vue({
el: "#app",
data: {
Value: "Hello there"
}
});
这有效并在页面上生成 Hello there
。
配置 typescript
这看起来很简单,我的 js 文件夹下有一个 TypeScripts 文件夹,“源”.ts 文件将位于该文件夹中。输出文件将作为 .js 文件位于 js 文件夹中。这是位于 TypeScripts 文件夹中的 tsconfig.json
:
{
"compileOnSave": true,
"compilerOptions": {
"noEmitOnError": true,
"noImplicitAny": false,
"outDir": "../",
"removeComments": false,
"sourceMap": true,
"target": "es5",
"module": "amd" // <-- Should this be used?
},
"exclude": [
"node_modules",
"wwwroot"
]
}
这有效,每次保存 .ts 文件时我都会得到 .js 文件。
但是,现在我想以我在视频和在线代码中看到的方式将 Vue 合并到 .ts 中。以下代码编译无误:
JavaScript - ES6 - test2.ts
const Vue = require("vue")
const app = new Vue({
el: "#app",
data: {
Value: "Hello there"
}
})
现在我将 HTML 更新为以下内容:
HTML
<div id="app">
<h4>{{ Value }}</h4>
</div>
@section Scripts {
<script src="~/js/test2.js"></script>
}
我重新加载页面,我得到的只是 {{ Value }}
标记。加上 JavaScript 错误:Uncaught ReferenceError: require is not defined
。
这看起来很简单,我想我只是将以下行添加到脚本部分并删除对 test2.js
文件的单个引用:
@section Scripts {
<script src="~/lib/require.min.js" data-main="/js/test2.js"></script>
}
重新加载,现在我得到:未捕获错误:尚未为上下文加载模块名称“vue”:_。使用 require([])
引用 this但该代码现在似乎与 .ts 文件的外观有所不同。
ES6 Test2.ts 文件似乎是人们编码的方式。它希望我在上面的链接中编写 require 语句的方式似乎更加冗长,并且没有出现在我看到的任何代码示例中。所以我一定是错过了什么。如果有帮助,Vue 和 Require 下载来 self 的 package.json
(npm) 文件,如下所示:
"devDependencies": {
"@types/node": "^9.4.7",
"requirejs": "^2.3.5",
"vue": "^2.5.16"
...
}
还有我的 bundleconfig.json
,它将它们放在它们应该去的 wwwroot/lib
文件夹中。
{
"outputFileName": "wwwroot/lib/require.min.js",
"inputFiles": ["node_modules/requirejs/require.js"]
},
{
"outputFileName": "wwwroot/lib/vue/vue.js",
"inputFiles": [ "node_modules/vue/dist/vue.js" ]
}
我不得不相信我离得到它是如此之近。能够在更现代的 ES 版本中编写代码很棒。我只是找不到合适的拼图来拼凑它们。
最佳答案
上面的主要问题是因为在第一个“纯 JavaScript”示例中,您根本没有使用模块。您直接在页面中加载 Vue 库,这会创建全局 Vue 对象,然后您的脚本是全局的(即不是模块)并直接引用 Vue 对象。
对于 test2.ts 文件,您提到这是 ES6,但您随后在 Vue 库中“要求”。这意味着代码现在尝试使用模块,但不是 ES6 模块,而是 CommonJS 模块。 (你会在哪里写类似 import Vue from "vue"
的东西)。这意味着它将在运行时需要一个加载器(例如,您尝试使用的 require.js 库),如果配置正确,它可以工作,但通常您需要像 WebPack 这样的东西来打包 Vue .js 和您的代码放入一个独立的包中,页面在运行时加载。
注意:以下段落经过编辑
我创建了一个示例 ASP.NET Core 项目,展示了如何配置 TypeScript 和 WebPack 以通过脚本标记使用全局 Vue.js 对象为每页生成一个包。我已经在上面放了一份详尽的自述文件来解释所有的工作原理。你可以在https://github.com/billti/SimpleVueApp看到它.如果您有进一步的反馈,我会继续更新以使其更好/更清晰。
也就是说,当您深入 Vue 时,需要注意一个 Visual Studio 限制。目前没有对 .vue 文件的丰富支持(在文档中称为“单文件组件”)。我所说的“丰富支持”是指这些文件具有我们现在无法推断的特定上下文以提供良好的 IntelliSense(即完成列表、错误、工具提示等)。此外,Visual Studio 中的 HTML 文件(这是您打开 .vue 文件的方式)在 <style>
中也仅支持纯 CSS。标签,以及 <script>
中的纯 JavaScript当前使用标签,而通过正确的 Vue 和 WebPack 设置,您可以直接在样式标签中编写 LESS 代码,以及直接在脚本标签中编写 TypeScript。我的团队目前正在研究这个问题,并希望在不久的将来对此进行改进。
如果有任何不清楚的地方,请告诉我。很乐意进一步提供帮助。
关于visual-studio - 如何在 Visual Studio 2017 中配置 TypeScript 和 Require,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49281322/
我已经写了并且 npm 发布了这个:https://github.com/justin-calleja/pkg-dependents 现在我正在用 Typescript 编写这个包:https://g
我有一个函数,我想在 TypeScript 中模拟它以进行测试。在我的测试中,我只关心 json和 status .但是,当使用 Jest 的 jest.spyOn 时我的模拟函数的类型设置为返回 h
我正在使用一个库 (Axios),它的包中包含 Typescript 声明。 我想声明一个将 AxiosResponse(在库的 .d.ts 文件中声明)作为参数的函数。我有以下内容: functio
我是 Typescript 的新手。我想使用 将一个 Typescript 文件加载到另一个 Typescript 文件中标签。 我做了一些事情,但它不起作用!请帮助我。 first.ts: imp
为什么我会收到下面屏幕截图中显示的错误? Atom 说我的 tsconfig.json“项目文件包含无效选项”用于 allowJs、buildOnSave 和 compileOnSave。 但是应该允
所以我正在创建一个 TypeScript 库,我可以轻松地将所有生成的 JS 文件编译成一个文件。有没有办法将所有 .ts 和 .d.ts 编译成一个 .ts 文件? 除了支持 JS 的版本(较少的智
Microsoft Research 提供了一种名为Safer TypeScript 的新 TypeScript 编译器变体: http://research.microsoft.com/en-us/
我需要这个来在单个文件中分发 TypeScript 中的库。有没有办法将多个 typescript 文件合并到(一个js文件+一个 typescript 定义)文件中? 最佳答案 要创建一个库,您可以
用例:我想知道一个函数在 typescript 中执行需要多少时间。我想为此目的使用装饰器。我希望装饰器应该返回时间以便(我可以进一步使用它),而不仅仅是打印它。 例如: export functio
我想检查一个类型是否可以为 null,以及它是否具有值的条件类型。 我尝试实现 type IsNullable = T extends null ? true : false; 但是好像不行 type
我的问题是基于这个 question and answer 假设我们有下一个代码: const myFn = (p: { a: (n: number) => T, b: (o: T) => v
我知道双重否定前缀,我知道 TypeScript 的单后缀(非空断言)。 但是这个双后缀感叹号是什么? /.*验证码为(\d{6}).*/.exec(email.body!!)!![1] 取自here
我正在使用以下文件结构在 Webstorm 中开发一个项目 | src | ... | many files | types | SomeInterface |
在 TypeScript 类中,可以为属性声明类型,例如: class className { property: string; }; 如何在对象字面量中声明属性的类型? 我试过下面的代码,但它
我正在寻找一种在不丢失推断类型信息的情况下将 TypeScript 中的文字值限制为特定类型的好方法。 让我们考虑一个类型Named,它保证有一个名字。 type Named = { name:
在 TypeScript 中,我想创建一个联合类型来表示属于一个或多个不同类型的值,类似于 oneOf在 OpenAPI或 JSON Schema .根据a previous answer on a
type Func = (foo:string) => void // function expression const myFunctionExpression:Func = function(f
假设我有一个联合类型,我正在使用类似 reducer 的 API 调用模式,看起来像这样: type Action = { request: { action: "create
我在 typescript 中有以下去抖功能: export function debounce( callback: (...args: any[]) => void, wait: numb
在 Vue3 的 defineComponent 函数中,第一个泛型参数是 Props,所以我在这里使用 Typescript 接口(interface)提供我的 props 类型。喜欢: expor
我是一名优秀的程序员,十分优秀!