如何解决这个错误你可能需要一个合适的加载器来处理这个文件类型
how to solve this error You may need an appropriate loader to handle this file type
我在这个库中遇到了这个错误 https://github.com/react-native-web-community/react-native-web-linear-gradient/
错误link
https://github.com/react-native-web-community/react-native-web-linear-gradient/issues/1
错误详情:
模块解析失败:意外标记 (5:22)
您可能需要一个合适的加载器来处理这种文件类型。
我的网络包:
'use strict';
const autoprefixer = require('autoprefixer');
const path = require('path');
const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin');
const InterpolateHtmlPlugin = require('react-dev-utils/InterpolateHtmlPlugin');
const WatchMissingNodeModulesPlugin = require('react-dev-utils/WatchMissingNodeModulesPlugin');
const eslintFormatter = require('react-dev-utils/eslintFormatter');
const ModuleScopePlugin = require('react-dev-utils/ModuleScopePlugin');
const getClientEnvironment = require('./env');
const paths = require('./paths');
const publicPath = '/';
const publicUrl = '';
const env = getClientEnvironment(publicUrl);
module.exports = {
devtool: 'cheap-module-source-map',
entry: [
require.resolve('./polyfills'),
require.resolve('react-dev-utils/webpackHotDevClient'),
paths.appIndexJs,
],
output: {
pathinfo: true,
filename: 'static/js/bundle.js',
chunkFilename: 'static/js/[name].chunk.js',
publicPath: publicPath,
devtoolModuleFilenameTemplate: info =>
path.resolve(info.absoluteResourcePath).replace(/\/g, '/'),
},
resolve: {
modules: ['node_modules', paths.appNodeModules].concat(
process.env.NODE_PATH.split(path.delimiter).filter(Boolean)
),
extensions: ['.web.js', '.mjs', '.js', '.json', '.web.jsx', '.jsx'],
alias: {
'babel-runtime': path.dirname(
require.resolve('babel-runtime/package.json')
),
'react-native': 'react-native-web',
'react-native-linear-gradient': 'react-native-web-linear-gradient'
},
plugins: [
new ModuleScopePlugin(paths.appSrc, [paths.appPackageJson]),
],
},
module: {
strictExportPresence: true,
rules: [
{
test: /\.(js|jsx|mjs)$/,
enforce: 'pre',
use: [
{
options: {
formatter: eslintFormatter,
eslintPath: require.resolve('eslint'),
baseConfig: {
extends: [require.resolve('eslint-config-react-app')],
},
ignore: false,
useEslintrc: false,
},
loader: require.resolve('eslint-loader'),
},
],
include: paths.appSrc,
},
{
oneOf: [
{
test: [/\.bmp$/, /\.gif$/, /\.jpe?g$/, /\.png$/],
loader: require.resolve('url-loader'),
options: {
limit: 10000,
name: 'static/media/[name].[hash:8].[ext]',
},
},
{
test: /\.(js|jsx|mjs)$/,
include: paths.appSrc,
loader: require.resolve('babel-loader'),
options: {
babelrc: false,
presets: [require.resolve('babel-preset-react-app')],
cacheDirectory: true,
},
},
{
test: /\.css$/,
use: [
require.resolve('style-loader'),
{
loader: require.resolve('css-loader'),
options: {
importLoaders: 1,
},
},
{
loader: require.resolve('postcss-loader'),
options: {
ident: 'postcss',
plugins: () => [
require('postcss-flexbugs-fixes'),
autoprefixer({
browsers: [
'>1%',
'last 4 versions',
'Firefox ESR',
'not ie < 9', // React doesn't support IE8 anyway
],
flexbox: 'no-2009',
}),
],
},
},
],
},
{
exclude: [/\.js$/, /\.html$/, /\.json$/],
loader: require.resolve('file-loader'),
options: {
name: 'static/media/[name].[hash:8].[ext]',
},
},
],
},
],
},
plugins: [
new InterpolateHtmlPlugin(env.raw),
new HtmlWebpackPlugin({
inject: true,
template: paths.appHtml,
}),
new webpack.NamedModulesPlugin(),
new webpack.DefinePlugin(env.stringified),
new webpack.HotModuleReplacementPlugin(),
new CaseSensitivePathsPlugin(),
new WatchMissingNodeModulesPlugin(paths.appNodeModules),
new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/),
],
node: {
dgram: 'empty',
fs: 'empty',
net: 'empty',
tls: 'empty',
child_process: 'empty',
},
performance: {
hints: false,
},
};
提出问题的class人:
import React, { PureComponent } from 'react';
import { View } from 'react-native';
export default class LinearGradient extends PureComponent {
static defaultProps = {
start: {
x: 0.5,
y: 0,
},
end: {
x: 0.5,
y: 1,
},
locations: [],
colors: [],
};
state = {
width: 1,
height: 1,
};
measure = ({ nativeEvent }) =>
this.setState({
width: nativeEvent.layout.width,
height: nativeEvent.layout.height,
});
getAngle = () => {
// Math.atan2 handles Infinity
const angle =
Math.atan2(
this.state.width * (this.props.end.y - this.props.start.y),
this.state.height * (this.props.end.x - this.props.start.x)
) +
Math.PI / 2;
return angle + 'rad';
};
getColors = () =>
this.props.colors
.map((color, index) => {
const location = this.props.locations[index];
let locationStyle = '';
if (location) {
locationStyle = ' ' + location * 100 + '%';
}
return color + locationStyle;
})
.join(',');
render() {
return (
<View
style={[
this.props.style,
{ backgroundImage: `linear-gradient(${this.getAngle()},${this.getColors()})` },
]}
onLayout={this.measure}
>
{this.props.children}
</View>
);
}
}
static defaultProps and ()=> make the bug so what can be wrong?
我认为这是因为 ES7 特性。您是否已安装 stage-0
并将其添加到您的 .babelrc
或 webpack.config.js
文件中?
这里是你如何做到的:
npm i --save-dev babel-preset-stage-0
然后你应该将它包含到 webpack.config.js
文件中,如下所示:
loader: "babel-loader", // or just "babel"
query: {
presets: [ <other presets>, 'stage-0']
}
或添加到.babelrc
文件:
{
"presets": ["stage-0"]
}
更新
正如我之前所说,这个问题属于 ES7 特性。似乎 webpack
无法解析 react-native-web-linear-gradient
模块中的 static
关键字。所以我做了什么来解决这个问题:
- 我将源代码从
react-native-web-linear-gradient
复制到我自己的名为 LinearGradient
的组件中。我没有更改其中的任何内容。
- 我如上所述安装了
stage-0
并将其添加到 .babelrc
。
- 稍后我不再使用
react-native-web-linear-gradient
,而是使用我的 LinearGradient
组件。
结果我的页面出现了渐变。 git
项目 link.
希望对您有所帮助!
部分修复 >>
步骤:
1-npm install babel babel-cli --save-dev
上图书馆
2-我加"transpile": "babel src/index.js --out-file src/index-transpiled.js"
在 package.json
个脚本中
3-yarn transpile
4-我将 ES5 文件移动到我的代码中并且它有效
更新 - 完整修复
我包括我的 src 文件夹和 babel 的库
// Process JS with Babel.
{
test: /\.(js|jsx|mjs)$/,
include: [
/src\/*/,
/node_modules\/react-native-/,
],
loader: require.resolve('babel-loader'),
options: {
babelrc: false,
presets: [require.resolve('babel-preset-react-native')],
cacheDirectory: true
}
},
webpack可以这样配置成load assets,比如图片(pngs
、svgs
、jpgs
等等):
npm install --save-dev file-loader
- 在
webpack.config.js
中添加这个,在 module.exports.rules
下:
{
test: /\.(png|svg|jpg|gif)$/,
use: ["file-loader"]
}
Now, when you import MyImage
from './my-image.png'
, that image will be processed and added to your output directory and the MyImage
variable will contain the final url of that image after processing.
我在这个库中遇到了这个错误 https://github.com/react-native-web-community/react-native-web-linear-gradient/
错误link https://github.com/react-native-web-community/react-native-web-linear-gradient/issues/1 错误详情: 模块解析失败:意外标记 (5:22) 您可能需要一个合适的加载器来处理这种文件类型。
我的网络包:
'use strict';
const autoprefixer = require('autoprefixer');
const path = require('path');
const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin');
const InterpolateHtmlPlugin = require('react-dev-utils/InterpolateHtmlPlugin');
const WatchMissingNodeModulesPlugin = require('react-dev-utils/WatchMissingNodeModulesPlugin');
const eslintFormatter = require('react-dev-utils/eslintFormatter');
const ModuleScopePlugin = require('react-dev-utils/ModuleScopePlugin');
const getClientEnvironment = require('./env');
const paths = require('./paths');
const publicPath = '/';
const publicUrl = '';
const env = getClientEnvironment(publicUrl);
module.exports = {
devtool: 'cheap-module-source-map',
entry: [
require.resolve('./polyfills'),
require.resolve('react-dev-utils/webpackHotDevClient'),
paths.appIndexJs,
],
output: {
pathinfo: true,
filename: 'static/js/bundle.js',
chunkFilename: 'static/js/[name].chunk.js',
publicPath: publicPath,
devtoolModuleFilenameTemplate: info =>
path.resolve(info.absoluteResourcePath).replace(/\/g, '/'),
},
resolve: {
modules: ['node_modules', paths.appNodeModules].concat(
process.env.NODE_PATH.split(path.delimiter).filter(Boolean)
),
extensions: ['.web.js', '.mjs', '.js', '.json', '.web.jsx', '.jsx'],
alias: {
'babel-runtime': path.dirname(
require.resolve('babel-runtime/package.json')
),
'react-native': 'react-native-web',
'react-native-linear-gradient': 'react-native-web-linear-gradient'
},
plugins: [
new ModuleScopePlugin(paths.appSrc, [paths.appPackageJson]),
],
},
module: {
strictExportPresence: true,
rules: [
{
test: /\.(js|jsx|mjs)$/,
enforce: 'pre',
use: [
{
options: {
formatter: eslintFormatter,
eslintPath: require.resolve('eslint'),
baseConfig: {
extends: [require.resolve('eslint-config-react-app')],
},
ignore: false,
useEslintrc: false,
},
loader: require.resolve('eslint-loader'),
},
],
include: paths.appSrc,
},
{
oneOf: [
{
test: [/\.bmp$/, /\.gif$/, /\.jpe?g$/, /\.png$/],
loader: require.resolve('url-loader'),
options: {
limit: 10000,
name: 'static/media/[name].[hash:8].[ext]',
},
},
{
test: /\.(js|jsx|mjs)$/,
include: paths.appSrc,
loader: require.resolve('babel-loader'),
options: {
babelrc: false,
presets: [require.resolve('babel-preset-react-app')],
cacheDirectory: true,
},
},
{
test: /\.css$/,
use: [
require.resolve('style-loader'),
{
loader: require.resolve('css-loader'),
options: {
importLoaders: 1,
},
},
{
loader: require.resolve('postcss-loader'),
options: {
ident: 'postcss',
plugins: () => [
require('postcss-flexbugs-fixes'),
autoprefixer({
browsers: [
'>1%',
'last 4 versions',
'Firefox ESR',
'not ie < 9', // React doesn't support IE8 anyway
],
flexbox: 'no-2009',
}),
],
},
},
],
},
{
exclude: [/\.js$/, /\.html$/, /\.json$/],
loader: require.resolve('file-loader'),
options: {
name: 'static/media/[name].[hash:8].[ext]',
},
},
],
},
],
},
plugins: [
new InterpolateHtmlPlugin(env.raw),
new HtmlWebpackPlugin({
inject: true,
template: paths.appHtml,
}),
new webpack.NamedModulesPlugin(),
new webpack.DefinePlugin(env.stringified),
new webpack.HotModuleReplacementPlugin(),
new CaseSensitivePathsPlugin(),
new WatchMissingNodeModulesPlugin(paths.appNodeModules),
new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/),
],
node: {
dgram: 'empty',
fs: 'empty',
net: 'empty',
tls: 'empty',
child_process: 'empty',
},
performance: {
hints: false,
},
};
提出问题的class人:
import React, { PureComponent } from 'react';
import { View } from 'react-native';
export default class LinearGradient extends PureComponent {
static defaultProps = {
start: {
x: 0.5,
y: 0,
},
end: {
x: 0.5,
y: 1,
},
locations: [],
colors: [],
};
state = {
width: 1,
height: 1,
};
measure = ({ nativeEvent }) =>
this.setState({
width: nativeEvent.layout.width,
height: nativeEvent.layout.height,
});
getAngle = () => {
// Math.atan2 handles Infinity
const angle =
Math.atan2(
this.state.width * (this.props.end.y - this.props.start.y),
this.state.height * (this.props.end.x - this.props.start.x)
) +
Math.PI / 2;
return angle + 'rad';
};
getColors = () =>
this.props.colors
.map((color, index) => {
const location = this.props.locations[index];
let locationStyle = '';
if (location) {
locationStyle = ' ' + location * 100 + '%';
}
return color + locationStyle;
})
.join(',');
render() {
return (
<View
style={[
this.props.style,
{ backgroundImage: `linear-gradient(${this.getAngle()},${this.getColors()})` },
]}
onLayout={this.measure}
>
{this.props.children}
</View>
);
}
}
static defaultProps and ()=> make the bug so what can be wrong?
我认为这是因为 ES7 特性。您是否已安装 stage-0
并将其添加到您的 .babelrc
或 webpack.config.js
文件中?
这里是你如何做到的:
npm i --save-dev babel-preset-stage-0
然后你应该将它包含到 webpack.config.js
文件中,如下所示:
loader: "babel-loader", // or just "babel"
query: {
presets: [ <other presets>, 'stage-0']
}
或添加到.babelrc
文件:
{
"presets": ["stage-0"]
}
更新
正如我之前所说,这个问题属于 ES7 特性。似乎 webpack
无法解析 react-native-web-linear-gradient
模块中的 static
关键字。所以我做了什么来解决这个问题:
- 我将源代码从
react-native-web-linear-gradient
复制到我自己的名为LinearGradient
的组件中。我没有更改其中的任何内容。 - 我如上所述安装了
stage-0
并将其添加到.babelrc
。 - 稍后我不再使用
react-native-web-linear-gradient
,而是使用我的LinearGradient
组件。
结果我的页面出现了渐变。 git
项目 link.
希望对您有所帮助!
部分修复 >>
步骤:
1-npm install babel babel-cli --save-dev
上图书馆
2-我加"transpile": "babel src/index.js --out-file src/index-transpiled.js"
在 package.json
个脚本中
3-yarn transpile
4-我将 ES5 文件移动到我的代码中并且它有效
更新 - 完整修复
我包括我的 src 文件夹和 babel 的库
// Process JS with Babel.
{
test: /\.(js|jsx|mjs)$/,
include: [
/src\/*/,
/node_modules\/react-native-/,
],
loader: require.resolve('babel-loader'),
options: {
babelrc: false,
presets: [require.resolve('babel-preset-react-native')],
cacheDirectory: true
}
},
webpack可以这样配置成load assets,比如图片(pngs
、svgs
、jpgs
等等):
npm install --save-dev file-loader
- 在
webpack.config.js
中添加这个,在module.exports.rules
下:
{
test: /\.(png|svg|jpg|gif)$/,
use: ["file-loader"]
}
Now, when you import
MyImage
from'./my-image.png'
, that image will be processed and added to your output directory and theMyImage
variable will contain the final url of that image after processing.