Ich verwende Webpack mit vuejs. Webpack macht seine Sache, aber wenn ich mir die ausgegebene app.js-Datei ansehe, wird mir dieser Fehler angezeigt.
'import' und 'export' dürfen nur auf oberster Ebene erscheinen
Ich gehe davon aus, dass es ein Problem ist, weil babel den Code nicht konvertiert? Weil ich dies beim Anzeigen der Anwendung im Browser erhalte.
Unerwarteter Token-Import
Hier ist meine entry.js für meine Vuejs-Anwendung:
/*jshint esversion: 6 */
import Vue from 'vue';
import App from './App.vue';
import VueRouter from 'vue-router';
Vue.use(VueRouter);
require('./css/style.scss');
// Export the vue router
export var router = new VueRouter({
hashbang: false,
root: '/'
// history: true
});
// Set up routing and match routes to components
router.map({
'/': {
component: require('./components/home/Home.vue')
}
});
// Redirect to the home route if any routes are unmatched
router.redirect({
'*': '/'
});
// Start the app on the #app div
router.start(App, '#app');
Hier sind meine webpack.config.js:
var ExtractTextPlugin = require('extract-text-webpack-plugin');
var path = require('path');
module.exports = {
entry: './src/entry.js',
output: {
filename: './public/js/app.js'
},
devtool: 'source-map',
plugins: [
new ExtractTextPlugin('./public/css/style.css')
],
module: {
preLoaders: [{
test: /\.js$/,
exclude: /node_modules/,
loader: 'jshint-loader'
}],
loaders: [{
test: /\.scss$/,
loader: ExtractTextPlugin.extract(
'style',
'css!sass'
),
},
{
test: /\.vue$/,
loader: 'vue'
},
{
test: /\.js$/,
exclude: /node_modules/,
include: [
path.resolve(__dirname, "src/services"),
],
loader: 'babel-loader',
query: {
presets: ['es2015']
}
}]
}
};
Hier ist meine packages.json-Datei:
{
"name": "test-webpack",
"version": "1.0.0",
"description": "Myapp",
"main": "entry.js",
"scripts": {
"watch": "webpack-dev-server --Host $IP --port $PORT --hot --inline --config webpack.config.js",
"dev": "webpack",
"build": ""
},
"author": "Dev",
"license": "ISC",
"devDependencies": {
"babel-core": "^6.9.1",
"babel-loader": "^6.2.4",
"babel-plugin-transform-class-properties": "^6.10.2",
"babel-plugin-transform-runtime": "^6.9.0",
"babel-preset-es2015": "^6.9.0",
"babel-runtime": "^6.9.2",
"css-loader": "^0.23.1",
"extract-text-webpack-plugin": "^1.0.1",
"jshint": "^2.9.2",
"jshint-loader": "^0.8.3",
"node-sass": "^3.8.0",
"path": "^0.12.7",
"sass-loader": "^3.2.0",
"style-loader": "^0.13.1",
"vue-hot-reload-api": "^1.3.2",
"vue-html-loader": "^1.2.2",
"vue-loader": "^8.5.2",
"vue-style-loader": "^1.0.0",
"webpack": "^1.13.1",
"webpack-dev-server": "^1.14.1"
},
"dependencies": {
"vue": "^1.0.25",
"vue-router": "^0.7.13"
}
}
'import' und 'export' dürfen nur auf oberster Ebene erscheinen
Dies bedeutet, dass das Webpack den nicht transpilierten ES6-Code bündelt, weshalb diese import
/export
-Anweisungen gefunden werden. babel-loader
darf sich daher nicht nach Ihren Wünschen richten.
Wenn Sie einfach die include
- und exclude
-Regeln aus der Loader-Konfiguration entfernen, wirkt sich das Standardverhalten aus, alle Elemente außer dem, was sich in node_modules
befindet, zu transpilieren.
module.exports = {
entry: './src/entry.js',
output: {
filename: './public/js/app.js'
},
devtool: 'source-map',
plugins: [
new ExtractTextPlugin('./public/css/style.css')
],
module: {
preLoaders: [{
test: /\.js$/,
exclude: /node_modules/,
loader: 'jshint-loader'
}],
loaders: [{
test: /\.scss$/,
loader: ExtractTextPlugin.extract(
'style',
'css!sass'
),
},
{
test: /\.vue$/,
loader: 'vue'
},
{
test: /\.js$/,
loader: 'babel-loader',
query: {
presets: ['es2015']
}
}]
}
};
Ich habe diese Fehlermeldung erhalten, als mir eine schließende Klammer fehlte.
Vereinfachte Erholung:
const Foo = () => {
return (
'bar'
);
}; <== this bracket was missing
export default Foo;
Vergewissern Sie sich, dass Sie eine .babelrc-Datei haben, die angibt, was Babel als Transpiling verwenden soll. Ich habe etwa 30 Minuten damit verbracht, diesen exakten Fehler herauszufinden. Nachdem ich ein paar Dateien in einen neuen Ordner kopiert und herausgefunden hatte, dass ich die .babelrc-Datei nicht kopiert habe, weil sie verborgen war.
{
"presets": "es2015"
}
oder etwas in dieser Richtung ist das, wonach Sie in Ihrer .babelrc-Datei suchen
Achten Sie auch auf einen öffnenden Klammer-Syntaxfehler sowie {{
, durch den diese Fehlermeldung angezeigt werden kann
Verwenden von webpack 4.14.0 und babel-cli 6.26 Ich musste dieses Babel-Plugin installieren, um den SyntaxError: 'import' and 'export' may only appear at the top level
-Fehler zu beheben: babel-plugin-syntax-dynamic-import
Es wurde von Webpack Code Splitting Docs aus verlinkt.
Ich hatte das gleiche Problem mit webpack4, mir fehlte die Datei .babelrc im Stammordner:
{
"presets":["env", "react"],
"plugins": [
"syntax-dynamic-import"
]
}
Von package.json:
"babel-core": "^6.26.3",
"babel-loader": "^7.1.5",
"babel-plugin-syntax-dynamic-import": "^6.18.0",
"babel-polyfill": "^6.26.0",
"babel-preset-env": "^1.7.0",
"babel-preset-react": "^6.24.1",
Mein Fehler wird durch eine System.import('xxx.js')
-Anweisung verursacht. Nach dem Ersetzen durch import xxx from 'xxx.js'
wurde der Fehler behoben.
Ich denke es liegt daran, dass require('xxx.scss')
auch einen dynamischen Import verursacht hat.
Für den Fall in der Fragenbeschreibung sind meines Erachtens keine dynamischen Importe erforderlich. Daher sollte das Problem gelöst werden, indem alle require
s durch import ... from ...
ersetzt werden.
Für einige Fälle, in denen dynamische Importe erforderlich sind, benötigen Sie möglicherweise als Antwort auf diese Frage @ babel/plugin-syntax-dynamic-import .
async components
:Quelle: https://vueschool.io/articles/vuejs-tutorials/async-vuejs-components/
<script>
export default {
data: () => ({ show: false }),
components: {
Tooltip: () => import("./Tooltip")
}
};
</script>
Viel Glück...
Ich verwende Webpack 2.2.0, um meine React JS-Module zu bündeln.
Beim Importieren von Modulen in meiner Hauptdatei app.js ist ein ähnliches Problem aufgetreten.
Nach 30 Minuten Headbanging habe ich das RegEx für das Testen der Dateitypen in meiner webpack.config.js aktualisiert.
Beachten Sie sorgfältig das? Symbol in der Test-RegEx-Abfrage.
{
test: /\.js?$/,
exclude: /(node_modules)/,
loader: 'react-hot-loader'
}
Es hat für mich funktioniert !!
Möglicherweise fehlen Ihnen einige Plugins. Versuchen Sie Folgendes:
npm i --save-dev babel-plugin-transform-vue-jsx
npm i --save-dev babel-plugin-transform-runtime
npm i --save-dev babel-plugin-syntax-dynamic-import
Ich weiß nicht, wie ich dieses Problem anders lösen soll, aber das wird einfach gelöst. Der Loader Babel sollte am Anfang des Arrays platziert werden und alles funktioniert.
Dies ist keine direkte Antwort auf die ursprüngliche Frage, aber ich hoffe, dieser Vorschlag hilft jemandem mit ähnlichen Fehlern:
Wenn Sie eine neuere Web-API mit Webpack + Babel zum Transpilieren verwenden, erhalten Sie
Module parse failed: 'import' and 'export' may only appear at the top level
dann hast du wohl vergessen eine polyfüllung zu importieren.
Zum Beispiel:
Wenn Sie fetch()
api und Targeting für es2015 verwenden, sollten Sie dies tun
whatwg-fetch
polyfill zu package.json hinzuimport {fetch} from 'whatwg-fetch'
Ich habe diesen Fehler nach dem Upgrade auf Webpack 4.29.x erhalten. Es stellte sich heraus, dass das Webpack 4.29.x den peerDependency-Fehler von npm auslöste. Nach ihrer Aussage wird der Fehler nicht bald behoben. Hier ist der workaround von sokra
"acorn": "^6.0.5"
zu Ihrer Anwendung package.json hinzu.yarn
. Es hat diesen Fehler nicht.npm update acorn --depth 20
npm dedupe
(funktioniert nur in einigen Fällen)rm package-lock.json
npm i
(funktioniert nur in einigen Fällen)4.28.4
in Ihrer package.json