typescript - 如何在没有复杂构建系统的情况下将 Vue 与 Typescript 一起使用?

标签 typescript asp.net-core vue.js

我已经花了 2 天时间对此进行试验,到目前为止还没有取得任何进展。我有一个非常基本的 ASP.NET Core 网站,为 Typescript 2.9 配置。我希望我的前端非常简单,每个页面只有一个 vue 应用程序,没有复杂的构建系统或组件。

我希望获得某种最低限度的配置。这是我当前的 tsconfig.json 文件:

{
  "compilerOptions": {
    "declaration": true,
    "mapRoot": "/js/",
    "module": "esnext",
    "removeComments": true,
    "sourceMap": true,
    "target": "esnext"
  },
  "compileOnSave": true

}

(注意,我已经尝试过 es6、es5 模块,但都没有)

然后,在我的 wwwroot/js 文件夹中,我有 Site.ts,如下所示:

import { Vue } from "./types/vue";

var _mixin: any;
var _vue = new Vue({
    el: '#vueheader',
    mixins: [_mixin],
    data: {
    },
    methods: {},
    mounted: function () {
    },
});

在 wwwroot/js/types 文件夹中,我有来自 vue 的 5 个 d.ts 文件,以及 vue.js 文件。 typescript 正确编译成一个 js 文件,但是当我访问主页时,我在 chrome 中收到错误提示“404,找不到文件/types/vue”

这里是编译后的 Site.js:

import { Vue } from "./types/vue";
var _mixin;
var _vue = new Vue({
    el: '#vueheader',
    mixins: [_mixin],
    data: {},
    methods: {},
    mounted: function () {
    },
});
//# sourceMappingURL=/js/Site.js.map

我的 html 有这个链接:

有人有什么想法吗?请不要让我使用像 webpack 这样复杂的构建系统。我不想让 600 多个依赖项使我的构建过程变得臃肿。

最佳答案

这实际上非常简单!我基于我的第一个使用 Require.js 的 Vue TodoMVC 风格的应用程序。您可以为自己的项目进行推断。


最简单的方法是使用不需要捆绑的加载程序,例如 Require.js 或 System.js - 您所要做的就是使用 TypeScript 进行编译。

因为我使用的是 Require.js 和 Vue,所以这是我的 package.json

{
  "name": "vue-tutorial",
  "version": "1.0.0",
  "dependencies": {
    "@types/requirejs": "^2.1.28",
    "vue": "^2.1.4"
  }
}

接下来,我要添加一个tsconfig.json

{
    "compilerOptions": {
        "outFile": "./built/app.js",
        "noImplicitAny": true,
        "strictNullChecks": true,
        "noImplicitThis": true,
        "module": "amd",
        "moduleResolution": "node",
        "esModuleInterop": true,
        "lib": [
            "dom", "es2015"
        ],
        "types": [
            "requirejs"
        ]
    },
    "include": [
        "src"
    ]
}

让我们分解一下:

  • outFile:TypeScript 会有效地将您的源代码打包到一个文件中(但不是它的依赖项!)。
  • noImplicitAnystrictNullChecksnoImplicitThis:只是一些特定的 --strict 选项我强烈建议你打开至少。
  • module: amd:AMD 是 Require.js 可以理解的模块格式。
  • moduleResolution: node:这使得 TypeScript 可以轻松地从 node_modules 中获取 .d.ts 文件。
  • esModuleInterop:这允许我们使用现代语法导入 Vue。
  • lib:指定您希望在运行时拥有的标准 API。
  • types:.d.ts 文件用于我们不一定要导入的库;我们不导入 Require.js,因为我们希望它在全局范围内可用。

现在我们的index.html:

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8" />
    <title>Hello Vue!</title>
</head>

<body>
    <div id="app"></div>

    <script src="https://unpkg.com/requirejs@2.3.5/require.js"></script>
    <script src="./built/app.js"></script>
</body>

</html>

让我们在 src/components/GreetingComponent.ts 中创建我们的第一个组件:

import Vue from "vue";

export default Vue.extend({
    template: `<div>Hello {{name}}!</div>`,
    props: ["name"],
});

接下来,让我们创建一个index.ts:

import Vue from "vue";
import GreetingComponent from "./components/GreetingComponent";

new Vue({
    el: "#app",
    template: `<greeting-component name="Steve"></greeting-component>`,
    components: {
        GreetingComponent
    }
});

最后让我们创建一个 Bootstrap 来实际导入您的 require-config.ts:

require.config({
    paths: {
        // JS library dependencies go here.
        // We're using a CDN but you can point to your own assets.
        "vue": "https://unpkg.com/vue@2.5.16/dist/vue",
    }
});
require(["index"]);

解释:

  • paths 将告诉 Require.js 在您使用裸路径导入 Vue 和其他库时在哪里寻找它们。您可以自定义 Require.js 将在何处找到 Vue,但请记住您必须省略 URL 末尾的 .js
  • 最后调用 require 将加载您的 index 模块以启动您的程序。

运行 tsc,打开 index.html,一切正常!

关于typescript - 如何在没有复杂构建系统的情况下将 Vue 与 Typescript 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50649516/

相关文章:

c# - 在ASP.Net核心中应用粒度权限限制

javascript - 在移动 chrome 上调整窗口大小时 flexbox 中的奇怪行为

vue.js - 全新 Vue.js 3 项目中出现 "exports is not defined"错误

javascript - Vue js 2-无法安装组件 : template or render function not defined

scope - 如何正确处理 typescript 中的范围

typescript - 如何使用 TS 编译器 API 来查看 .d.ts 中的类型是否已更改?

javascript - 在 Babel 7+ 中使用 TypeScript 有什么好处

javascript - 将带有 Promise 的函数从 JS 转换为 TS 时出现问题

c# - 为什么 Application Insights 依赖关系时间线存在间隙?

mysql - 如何从 Linux 上的 asp.net 核心应用程序迁移我的表