【问题标题】:Typescript 2.0.3 with @types definitions, Webpack, Foundation, jQuery is not defined带有@types 定义的Typescript 2.0.3、Webpack、Foundation、jQuery 未定义
【发布时间】:2017-02-25 08:32:04
【问题描述】:

我正在尝试使用带有 @types 定义的 TypeScript 2.0.3 构建应用程序,并希望使用基础站点​​并将所有内容与 webpack 捆绑在一起。 一旦我尝试导入基础,我就会收到未定义 jQuery 的控制台错误消息。 当我不导入基础时,jQuery 工作正常!

如果有人能解释一下,我做错了什么以及如何加载,例如来自 .ts 文件的 Foundation Tooltip,真是太棒了。

您可以在此处查看完整的源代码:https://github.com/Der-Alex/typescript-foundation-webpack

我正在做的是基本的: 我有一个 ./app 文件夹。里面有一个app.ts、main.scss和index.html。

我安装了以下 npm 包:

...
"dependencies": {
  "@types/foundation-sites": "^6.1.28",
  "@types/jquery": "^2.0.33",
  "css-loader": "^0.25.0",
  "foundation-sites": "^6.2.3",
  "jquery": "^2.1.0",
  "node-sass": "^3.10.1",
  "sass-loader": "^4.0.2",
  "style-loader": "^0.13.1",
  "ts-loader": "^0.9.1",
  "typescript": "^2.0.3",
  "webpack": "^1.13.2"
},
"devDependencies": {
  "webpack-dev-server": "^1.16.2"
}

我的 webpack.config.js:

module.exports = {
  entry: './app/app.ts',
  output: {
    filename: './app/bundle.js'
  },
  resolve: {
    extensions: ['', '.ts', '.js']
  },
  module: {
    loaders: [
      {
        test: /\.ts$/, loader: 'ts-loader'
      },
      {
        test: /\.scss/, loaders: ['style', 'css', 'sass']
      }
    ]
  }
};

我的 ./app/app.ts:

import './main.scss';
import * as $ from 'jquery';
import 'foundation-sites';

$(() => {
  $(document).foundation();
});

没有转译/编译错误。当我运行 webpack-dev-server 并在浏览器中检查结果时,样式已加载,但我收到此错误消息“未定义 jQuery”。浏览器理解 $ 但例如不理解 $(...).on(...); 那我做错了什么?

【问题讨论】:

    标签: jquery typescript types webpack zurb-foundation


    【解决方案1】:

    最后我让它只与 webpack 一起工作! 借助开发同事的一些重要信息,我发现了该帖子: Managing jQuery plugin dependency in webpack

    这给了我以下提示:

    1. 需要全局命名空间下的 jquery

      global.jQuery = require('jquery');

    2. 添加别名

      resolve: { extensions: ['', '.ts', '.js'], alias: { jquery: "jquery/src/jquery" } }

    3. 添加 $ 和 jQuery 作为插件

      new webpack.ProvidePlugin({ $: "jquery", jQuery: "jquery" })

    这使得 jQuery 成为一个全局对象,可以像这样在 .ts 文件中使用:

    import * as $ from 'jquery';
    $(document).foundation();
    

    我认为,这是使用 webpack 加载 jQuery 的最简洁方式。 所以如果这个答案被投票,我真的很感激。

    【讨论】:

      【解决方案2】:

      您应该将其添加到 tsconfig.json 文件的 compilerOptions 中:

      "typeRoots": [
          "node_modules/@types"
      ]
      

      【讨论】:

      • 嗨@Macondiana。我不确定,这应该如何帮助我解决我的问题。 typeRoots 只告诉打字稿,在哪里寻找哪些类型。我的问题是,webpack 不包含全局 jQuery。
      【解决方案3】:

      我认为在这种情况下,问题是由于如果使用 webpack(默认为 CommonJS 样式)导入 jQuery,它不会创建 foundation-sites 所依赖的全局 jQuery 变量。您可以尝试在代码中公开它,看看它是否能解决问题:

      import * as $ from 'jquery'; window.jQuery = $; import 'foundation-sites';

      【讨论】:

      • 非常感谢,Stubb0rn!
      • 我不得不将 window.$ 更改为 window['jQuery']。 TypeScript 不允许在 .句法。但现在它起作用了!谢谢!
      猜你喜欢
      • 2017-07-12
      • 1970-01-01
      • 2017-08-13
      • 2019-06-09
      • 2020-03-27
      • 2019-01-06
      • 2018-05-08
      • 2017-04-13
      • 2021-02-25
      相关资源
      最近更新 更多