J'ai eu cette erreur avec cette bibliothèque https://github.com/react-native-web-community/react-native-web-linear-gradient/
le lien d'erreur https://github.com/react-native-web-community/react-native-web-linear-gradient/issues/1 détails de l'erreur: échec de l'analyse du module: jeton inattendu ( 5:22) Vous pouvez avoir besoin d'un chargeur approprié pour gérer ce type de fichier.
mon webpack:
'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,
},
};
la classe qui pose le problème:
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 et () => rendre le bogue alors qu'est-ce qui pourrait être faux?
Correction partielle >>
Pas:
1-npm install babel babel-cli --save-dev
sur la bibliothèque
2-J'ajoute "transpile": "babel src/index.js --out-file src/index-transpiled.js"
dans package.json
scripts
3 -yarn transpile
4-J'ai déplacé le fichier ES5 dans mon code et cela a fonctionné
Mise à jour - Fix complète
I inclus mon dossier src et les bibliothèques à babel aussi
// 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
}
},
Je pense que c'est à cause de la fonction ES7. As-tu stage-0
installé et ajouté à votre .babelrc
ou webpack.config.js
fichier?
Voici comment vous pouvez le faire:
npm i --save-dev babel-preset-stage-0
Et puis vous devriez l'inclure dans webpack.config.js
fichier comme ci-dessous:
loader: "babel-loader", // or just "babel"
query: {
presets: [ <other presets>, 'stage-0']
}
Ou ajoutez-le à .babelrc
fichier:
{
"presets": ["stage-0"]
}
[~ # ~] mise à jour [~ # ~]
Comme je l'ai dit plus tôt, le problème appartient à la fonction ES7. Il semble que webpack
ne puisse pas résoudre le mot clé static
dans react-native-web-linear-gradient
module. Donc, ce que j'ai fait pour résoudre ce problème:
react-native-web-linear-gradient
dans mon propre composant appelé LinearGradient
. Je n'y ai rien changé.stage-0
et l'a ajouté à .babelrc
comme je l'ai décrit ci-dessus.react-native-web-linear-gradient
j'utilise mon composant LinearGradient
.En conséquence, j'ai obtenu un dégradé sur ma page. git
lien du projet.
J'espère que cela vous aidera!
Voici comment le webpack peut être configuré pour charger les ressources , comme les images (pngs
, svgs
, jpgs
et ainsi de suite):
npm install --save-dev file-loader
webpack.config.js
, sous le module.exports.rules
:{
test: /\.(png|svg|jpg|gif)$/,
use: ["file-loader"]
}
Maintenant, lorsque vous importez
MyImage
depuis'./my-image.png'
, cette image sera traitée et ajoutée à votre répertoire de sortie et la variableMyImage
contiendra l'url finale de cette image après traitement.