Javascript SyntaxError:';导入&x27;和';出口';只能与';sourceType:module';-吞咽
考虑以下两个文件:Javascript SyntaxError:';导入&x27;和';出口';只能与';sourceType:module';-吞咽,javascript,gulp,ecmascript-6,browserify,babeljs,Javascript,Gulp,Ecmascript 6,Browserify,Babeljs,考虑以下两个文件: app.js import Game from './game/game'; import React from 'react'; import ReactDOM from 'react-dom'; export default (absPath) => { let gameElement = document.getElementById("container"); if (gameElement !== null) {
app.js
import Game from './game/game';
import React from 'react';
import ReactDOM from 'react-dom';
export default (absPath) => {
let gameElement = document.getElementById("container");
if (gameElement !== null) {
ReactDOM.render(
<Game mainPath={absPath} />,
gameElement
);
}
}
import App from './src/app';
var gulp = require('gulp');
var source = require('vinyl-source-stream');
var browserify = require('browserify');
var babelify = require("babelify");
var watch = require('gulp-watch');
gulp.task('make:game', function(){
return browserify({
entries: [
'index.js'
]
})
.transform('babelify')
.bundle()
.pipe(source('index.js'))
.pipe(gulp.dest('app/'));
});
gulpfile.js
import Game from './game/game';
import React from 'react';
import ReactDOM from 'react-dom';
export default (absPath) => {
let gameElement = document.getElementById("container");
if (gameElement !== null) {
ReactDOM.render(
<Game mainPath={absPath} />,
gameElement
);
}
}
import App from './src/app';
var gulp = require('gulp');
var source = require('vinyl-source-stream');
var browserify = require('browserify');
var babelify = require("babelify");
var watch = require('gulp-watch');
gulp.task('make:game', function(){
return browserify({
entries: [
'index.js'
]
})
.transform('babelify')
.bundle()
.pipe(source('index.js'))
.pipe(gulp.dest('app/'));
});
错误:
gulp make:game
[13:09:48] Using gulpfile ~/Documents/ice-cream/gulpfile.js
[13:09:48] Starting 'make:game'...
events.js:154
throw er; // Unhandled 'error' event
^
SyntaxError: 'import' and 'export' may appear only with 'sourceType: module'
这是什么错误?我做错了什么?旧版本的Babel都是开箱即用的。新版本要求您安装安装程序需要的任何插件。首先,您需要安装ES2015预设
npm install babel-preset-es2015 --save-dev
接下来,您需要告诉babelify使用您安装的预设
return browserify({ ... })
.transform(babelify.configure({
presets: ["es2015"]
}))
...
要正确编译es2015 react代码,您应该安装一些节点模块: 全球
npm安装-g browserify
在应用程序目录中:
npm init
npm安装--保存开发浏览器浏览babelify babel-preset-es2015 babel-preset-stage-0 babel-preset
然后创建吞咽任务:
var browserify = require("browserify");
var babelify = require("babelify");
gulp.task('es6-compile', function() {
browserify({ debug: true })
.transform(babelify.configure({ presets: ["es2015","react", "stage-0"] }))
.require("./public/src/javascripts/app.js", { entry: true })
.bundle()
.pipe(gulp.dest('./public/dest/javascripts'));
});
在./public/dest/javascripts目录中,您将找到已编译的es5 app.js文件。此错误可能是由于在gulp任务中未包含tsify plugin来编译typescript造成的 范例
var tsify = require('tsify');
return browserify({ ... })
.plugin(tsify)
.transform(babelify.configure({
presets: ["es2015"]
}))
...
请参见此处的安装和使用:
出于某种原因,babelify 8.0.0在es2015或env礼品上都不适合我。然而,我的插件确实对我有用。我的测试用例是作为全局窗口从导出
Spinner
。我的例子是回购;关键细节如下
main.js
从'spin.js'导入{Spinner};
window.Spinner=微调器;
试验
在空目录中:
npm init
并接受所有默认值,然后:
npm install --save spin.js
npm install --save-dev browserify esmify
npx browserify -p esmify main.js -o main-packed.js
测试HTML文件
var target=document.getElementById('x');
var spin=新微调器().spin(目标);
加载后,它会在页面中心显示一个微调器
注意:我与mattdesl或esmify没有关联。在我的案例中,我使用了导出,而不是导出
将export更改为exportsESLint本机不支持此操作,因为这违反了规范。但是如果使用babel ESLint解析器,则可以在ESLint配置文件中执行此操作:
{
“解析器”:“babel eslint”,
“解析选项”:{
“源类型”:“模块”,
“AllowPortExporterywhere”:true
}
}
文件编号:
此处引用的答案:在.eslintrc中,您可能需要指定解析器选项,例如:
{
"rules": {
"indent": [
2,
4
],
"linebreak-style": [
2,
"unix"
],
"semi": [
2,
"always"
]
},
"env": {
"es6": true,
"browser": true,
"node": true,
"mocha": true
},
"extends": "eslint:recommended",
"parserOptions": {
"ecmaVersion": 6,
"sourceType": "module",
"ecmaFeatures": {
"jsx": true
}
}
}
请查看中的文档指南。我在尝试从以ES6样式导出的
node\u modules
导入模块时遇到相同的错误。对我来说,没有什么建议是如此有效。然后我在上找到了常见问题部分。根据那里的了解,出现错误是因为默认情况下不会传输node_modules
中的模块,并且由Common.js风格模块驱动的节点无法理解其中的ES6声明,如export default ModuleName
因此,我更新了我的软件包,然后使用global
选项将babelify作为全局转换运行,不包括所有节点模块,但我感兴趣的模块,如babelify repo页面所示:
...
browserify.transform("babelify",
{
presets: ["@babel/preset-env"],
sourceMaps: true,
global: true,
ignore: [/\/node_modules\/(?!your module folder\/)/]
}).bundle()
...
希望对您有所帮助。如果您想通过npm中的
import
或require
方法在客户端使用任何东西,只需执行以下步骤
npm install browserify babelify@babel/preset env@babel/preset react@babel/core es2015——保存开发文件
以安装所需的预设包.json
/app
文件夹中创建一个名为dom_front.js
的文件,该文件夹包含要转换为客户端js的文件/node\u proj/app$node browserifyload.js
或运行/node\u proj/app$browserify dom\u front.js--transform babelify--standalone util>/assets/mynpmmodule.js
mynpmmodule.js的文件
util
like
const Component=util.Component;
控制台日志(组件);
const ReactDOM=util.ReactDOM;
我尝试了上面的所有答案,没有一个对我有效,我甚至尝试使用gulp include/require syntax,它们既不是解决方案,也不足以满足我的要求
这是我的要求
const-example=(参数:string)=>{}
).js
,我们还需要像其他软件包一样保留所有描述(JSDoc和Type真的很有帮助)
到目前为止,我能做的最好的事情就是将browserify
与tsify
一起使用。我无意中从中发现了此解决方法
我仍在寻找一种方法来保留我们的内联类型和注释/JSDocs,但我相信这足以满足您的需要。请看,在babelify中使用较新版本的Babel似乎有问题。在我的情况下,我没有使用babelify,但仍然会出现此错误。在我的情况下,我在尝试编译导入TypeScript文件的JS文件时,遇到了browserify和babelify的这个错误,例如import*
<script>
const Component = util.Component;
console.log(Component);
const ReactDOM = util.ReactDOM;
</script>
browserify()
.plugin(tsify, { target: 'es6' })
.transform(babelify, { extensions: [ '.tsx', '.ts' ] })