我正在努力使用Gulp& amp ;;设置我的React项目的基本编译。的WebPack
这是我的Gulpfile:
function styles() {
return gulp.src('./src/less/styles.less')
.pipe(less())
.pipe(gulp.dest('./dist'))
.pipe(connect.reload());
}
function copyAssets() {
return gulp.src('./assets/**')
.pipe(gulpCopy('./dist/'))
.pipe(connect.reload());
}
function watchAssets() {
gulp.watch('assets/**/*', copyAssets);
gulp.watch('src/less/**/*.less', styles);
}
function webpackBuildgulp() {
return gulp.src('src/js/index.js')
.pipe(webpack(webpackConfig))
.pipe(gulp.dest('dist/'));
}
gulp.task('default', gulp.parallel(styles, copyAssets, webpackBuildgulp, server, watchAssets));
这是我的Webpack配置:
module.exports = () => {
const webpackConfig = {
entry: './src/js/index.js',
module: {
rules: [{
test: /\.jsx$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: ['es2015', 'stage-0', 'react'],
},
},
}],
},
output: {
path: path.resolve(__dirname, '../dist'),
filename: 'app.js',
publicPath: 'http://localhost:1337/dist/',
},
resolve: {
modules: ['../src/js', 'node_modules'],
extensions: ['', '.js', 'jsx'],
},
plugins: [
new webpack.ProvidePlugin({
jQuery: 'jquery',
$: 'jquery',
}),
],
};
return webpackConfig;
};
这是package.json deps树:
"devDependencies": {
"babel-cli": "^6.24.1",
"babel-core": "^6.24.0",
"babel-loader": "^7.0.0",
"babel-plugin-transform-es2015-modules-commonjs": "^6.7.7",
"babel-plugin-transform-object-rest-spread": "^6.8.0",
"babel-plugin-transform-react-jsx": "^6.7.5",
"babel-preset-airbnb": "^1.0.1",
"babel-preset-es2015": "^6.24.1",
"babel-preset-react": "^6.5.0",
"babelify": "^7.3.0",
"chalk": "^1.1.3",
"connect-modrewrite": "^0.9.0",
"envify": "^3.4.1",
"enzyme": "^2.4.1",
"eslint": "^3.11.1",
"eslint-config-airbnb": "^13.0.0",
"eslint-plugin-import": "^2.2.0",
"eslint-plugin-jsx-a11y": "^2.2.3",
"eslint-plugin-react": "^6.8.0",
"gulp": "github:gulpjs/gulp#4.0",
"gulp-callback": "0.0.3",
"gulp-connect": "^5.0.0",
"gulp-imagemin": "^3.0.3",
"gulp-less": "^3.1.0",
"gulp-uglify": "^2.0.0",
"gulp-watch": "^4.3.9",
"gutil": "^1.6.4",
"husky": "^0.11.6",
"isparta": "^4.0.0",
"jasmine-core": "^2.4.1",
"jsdom": "^8.4.1",
"karma": "^0.13.19",
"karma-babel-preprocessor": "^6.0.1",
"karma-browserify": "^5.0.0",
"karma-chrome-launcher": "^0.2.2",
"karma-coverage": "^1.1.0",
"karma-jasmine": "^0.3.6",
"karma-nyan-reporter": "^0.2.4",
"karma-phantomjs-launcher": "^1.0.0",
"karma-sinon": "^1.0.4",
"less": "^2.6.1",
"less-plugin-autoprefix": "^1.5.1",
"less-plugin-clean-css": "^1.5.1",
"phantomjs-polyfill-object-assign": "0.0.2",
"phantomjs-prebuilt": "^2.1.4",
"react-addons": "^0.9.1-deprecated",
"react-addons-shallow-compare": "15.4.0",
"react-addons-test-utils": "15.4.0",
"react-asset-loader": "0.0.1",
"react-images": "^0.5.1",
"react-test-renderer": "15.4.0",
"require-dir": "^0.3.0",
"sinon": "^1.17.4",
"vinyl-buffer": "^1.0.0",
"vinyl-source-stream": "^1.1.0",
"watchify": "^3.7.0",
"webpack-dev-middleware": "^1.10.0",
"webpack-stream": "^3.2.0",
"when": "^3.7.7"
},
"dependencies": {
"animate.css": "^3.5.1",
"axios": "^0.12.0",
"classnames": "^2.2.5",
"es6-promise": "^3.2.1",
"fullcalendar": "3.3.1",
"fullcalendar-scheduler": "1.5.0",
"intl": "^1.2.4",
"jquery": "2.1.4",
"jquery-timepicker": "^1.3.3",
"lodash": "^4.13.1",
"moment": "2.18.1",
"moment-range": "^3.0.2",
"qtip2": "^3.0.3",
"rc-calendar": "^7.6.5",
"rc-time-picker": "^2.2.2",
"react": "15.4.0",
"react-animated-number": "^0.4.2",
"react-countup": "^1.3.0",
"react-datepicker": "^0.41.1",
"react-dom": "15.4.0",
"react-dropzone": "^3.5.3",
"react-geosuggest": "^1.24.1",
"react-google-maps": "^4.11.0",
"react-google-tag-manager": "^1.1.2",
"react-helmet": "^3.1.0",
"react-imageloader": "^2.1.0",
"react-intl": "^2.1.3",
"react-maskedinput": "^3.2.4",
"react-redux": "^5.0.0",
"react-redux-toastr": "^3.8.5",
"react-router": "^2.5.2",
"react-scrollbar": "^0.4.1",
"react-sortable": "1.2.0",
"react-sparklines": "^1.6.0",
"react-tabs": "^0.7.0",
"react-typist": "^1.1.0",
"redux": "^3.5.2",
"redux-form": "^6.3.2",
"redux-logger": "^2.6.1",
"redux-mock-store": "^1.1.2",
"redux-thunk": "^2.1.0",
"riek": "^1.0.4",
"slick-carousel": "^1.6.0",
"spid-sdk-js": "^2.1.7",
"vivus": "^0.3.1"
},
然而,当我编译我的项目时,键入gulp
我收到以下错误:
Module parse failed: /src/js/index.js Unexpected token (42:2)
You may need an appropriate loader to handle this file type.
SyntaxError: Unexpected token (42:2)
这是index.js文件:
import ReactDOM from 'react-dom';
import React from 'react';
import { Provider } from 'react-redux';
import { Router, browserHistory } from 'react-router';
import { IntlProvider } from 'react-intl';
import ReduxToastr from 'react-redux-toastr';
import createStore from './store';
import { SIGNIN_USER, getCurrentUser } from './actions/auth';
import { getSalonsBasicInfo } from './actions/landingPage';
import { stuff } from './middleware/stuff';
import { checkSalon } from './actions/salon';
import routes from './routes';
import translations from './translations/en';
if (!window.Intl) {
require('intl');
}
const store = createStore();
const access_token = localStorage.getItem('access_token');
const refresh_token = localStorage.getItem('refresh_token');
store.dispatch({
type: INIT,
});
if (access_token || refresh_token) {
store.dispatch({
type: SIGNIN_USER,
});
store.dispatch(getCurrentUser());
store.dispatch(checkSalon());
}
localStorage.setItem('debug', false);
ReactDOM.render(
<Provider store={store}>
<div>
<ReduxToastr
timeOut={4000}
newestOnTop={false}
position="top-center"
/>
<IntlProvider locale={'en-US'} messages={translations}>
<Router history={browserHistory} routes={routes} />
</IntlProvider>
</div>
</Provider>,
document.getElementById('app'),
);
不知怎的,Babel无法理解React代码并且没有编译它。
然而,当我手动运行Babel时:
babel src/js/index.js --presets es2015,react
效果很好。
我的Webpack配置出错了什么?
答案 0 :(得分:1)
您的babel-loader仅测试.jsx
个文件,并且您已将索引保存为.js
文件。将测试更改为test: /\.(js|jsx)$/,
,看看是否有帮助。
module: {
rules: [{
test: /\.(js|jsx)$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: ['es2015', 'stage-0', 'react'],
},
},
}],
}