SystemJS: Почему возникает ошибка jquery_1.default не является функцией при импорте jquery
Я установил основание через jspm install foundation, затем импортирую фундамент
и jquery.
Проблема, с которой я столкнулась, заключается в том, что если я импортирую jquery через import $ as 'jquery'
, я получаю ошибку. jquery_1.default не является функцией. Если я импортирую jquery через import * as $ from jquery
, он будет работать как ожидалось
Я вызываю $(document).foundation();
для инициализации компонентов javascript. Ниже мой main.ts
import 'foundation'
import $ from 'jquery';
import {Aurelia} from 'aurelia-framework';
export function configure(aurelia: Aurelia) {
aurelia.use
.standardConfiguration()
.developmentLogging();
aurelia.start().then(a => a.setRoot())
.then(a => {
// Initialize framework
$(document).foundation();
});
}
Остальная часть кода представляет собой просто навигацию по умолчанию на простую страницу, содержащую панель навигации с раскрывающимся списком
Примечание. Мне также пришлось явно установить jquery, хотя jquery указан как dep.
Я сделал оригинальное переопределение для основания 6, явно сделал что-то не так, но, похоже, он работал в то время. Тем не менее, с тех пор я узнал, что при установке bootstrap он помещает jquery в компоненты github: и это, похоже, делает так, что jquery не нужно явно устанавливать. Так что в то время все казалось прекрасным.
Для воспроизведения просто используйте скелет aurelia и добавьте страницу с помощью элемента управления основанием, добавив $(document).foundation(), как указано выше
Ответы
Ответ 1
Если вы используете typescript set module = system в своем tsconfig:
{
"compilerOptions": {
"module": "system",
"target": "es6",
"sourceMap": true,
"experimentalDecorators": true,
"emitDecoratorMetadata": true
},
"exclude": [
"node_modules",
"jspm_packages"
]
}
Ответ 2
Я считаю, что это проблема машинописи. Из того, что я могу сказать, он не учитывает оператор импорта в стиле es6 для унаследованного кода, то есть кода, который не имеет экспорта. Если вы используете старый стиль var $ = require ('jquery'), это работает.
Исправление для этого состоит в том, чтобы использовать флаг --allowSyntheticDefaultImports в true.
Первая ссылка внизу проблемы машинописи описывает это исправление
Смотрите эти обсуждения для более подробной информации
SystemJS и импорт по default
с export =
предложение
Импорт значений по умолчанию с синтаксисом es6 не работает
Не удается найти правильный синтаксис экспорта переменных по умолчанию
Ответ 3
Добавьте "esModuleInterop": true
в compilerOptions
в файле tsconfig.json
, например:
{
"compilerOptions": {
"module": "commonjs",
"esModuleInterop": true, // <-- ADD THIS LINE
"target": "es6",
"noImplicitAny": true,
"moduleResolution": "node",
"sourceMap": true,
"outDir": "dist",
"baseUrl": ".",
"paths": {
"*": [
"node_modules/*",
"src/types/*"
]
}
},
"include": [
"src/**/*"
]
}
Если вы используете IntelliJ, он может не обнаружить изменение в tsconfig.json сразу, поэтому может быть полезно попробовать перезапустить IntelliJ, чтобы посмотреть, работает ли он.
Важная заметка:
Обратите внимание, что на этот раз import * as express from 'express';
нотация будет генерировать ошибку.
См. Руководство по TypeScript 2.7 (https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-7.html):
Примечание. Новое поведение добавлено под флагом, чтобы избежать необоснованных разрывов в существующих базах кода. Мы настоятельно рекомендуем применять его как для новых, так и для существующих проектов. Для существующих проектов импорт пространства имен (import * as express from "express"; express();) необходимо будет преобразовать в импорт по умолчанию (import express from "express"; express();).
Ответ 4
Я думаю, что лучшим решением является импорт файла jquery в индексный файл, пожалуйста, проверьте ссылку ниже
https://github.com/TypeStrong/atom-typescript/issues/237#issuecomment-455837052