用TypeScript写前端React遇到的问题,未解决

下面是刚开始的webpack的配置文件

var path = require(‘path‘);
var webpack = require(‘webpack‘);
var OpenBrowserPlugin = require(‘open-browser-webpack-plugin‘);
var HtmlWebpackPlugin = require(‘html-webpack-plugin‘);
var application ={
    port:3002,
    entry:‘./application/index.tsx‘,
    outputFile: ‘app.js‘,
    outputDir: ‘dist‘,
    template: ‘application/index.html‘
};
module.exports = {
    entry: application.entry,
    devtool: "source-map",
    output: {
        filename: application.outputFile,
        path: path.resolve(__dirname, application.outputDir),
    },
    resolve: {
        extensions: [" " , ".ts", ".tsx", ".js", ".json"]
    },
    module: {
        rules: [
            { test: /\.tsx?$/, loader: "awesome-typescript-loader" },
            { enforce: "pre", test: /\.js$/, loader: "source-map-loader" }
        ]
    },
    devServer: {
        contentBase:path.resolve(__dirname, application.outputDir),
        historyApiFallback: true,
        port: application.port,
        inline: true,
        hot: true
    },
    plugins: [
        new webpack.HotModuleReplacementPlugin(),
        new HtmlWebpackPlugin({
            filename: ‘index.html‘,
            template: application.template
        }),
        new webpack.ProvidePlugin({
            $: "jquery",
            jQuery: "jquery",
            "window.jQuery": "jquery",
            React:‘react‘
        }),
        new OpenBrowserPlugin({url: ‘http://localhost:‘+ application.port})
    ]
};

写出的入口文件代码是:

import * as React from "react";
import * as ReactDOM from "react-dom";

console.dir($)
ReactDOM.render(
    <h2>hhh</h2>,
    document.getElementById("app")
);

当时老是报错:

Error:(4, 13) TS2304:Cannot find name ‘$‘.

Error:(4, 13) TS2304:Cannot find name ‘jQuery‘.

后来才发现是 npm install --save-dev @types/juqery 的问题

后来想把React在ProvidePlugin当成全局变量,以后就不用再ts文件中import了,

但是报错:

Error:(7, 6) TS2686:‘React‘ refers to a UMD global, but the current file is a module. Consider adding an import instead.

我直接写jsx文件如下:

var React = require("react");

var ReactDOM = require("react-dom");
console.dir(jQuery);
ReactDOM.render(React.createElement("h2", null, "hhh"), document.getElementById("app"));

没问题,

var ReactDOM = require("react-dom");
console.dir(jQuery);
ReactDOM.render(React.createElement("h2", null, "hhh"), document.getElementById("app"));

没问题

我大概明白了,

因为是在React中写的<h2>hhh</h2>是需要编译成React.createElement("h2", null, "hhh") ,所以在TSX文件中需要import React

为什么webpack.ProvidePlugin没有生效呢 , 其实生效了,在编译后的jsx文件中生效了.

所以

那我可以这样写吗

import * as ReactDOM from "react-dom";
ReactDOM.render(
    React.createElement("h2", null, "hhh"),
    document.getElementById("app")
);

发现又报错了.

所以

用TS写React就别想不import React ! 就酱

时间: 2024-10-08 11:32:12

用TypeScript写前端React遇到的问题,未解决的相关文章

[转载]听说2017你想写前端?

不好意思,没有像其他公众号一样赶着发文章,每年到这个时候总有一大波什么今年前端预测,技术框架预测什么的.我这次写这篇文针对的对象,是想在今年踏入前端这行的人们,不管你现在是徘徊在门口,还是已经半只脚踏入这片未知领域,都可以参考一下先行者的经验. 先来个大概预览: 项目工程化 发展方向 职业环境 总结要掌握的框架/技能 小结放在前: 2017的前端与其说更残酷,不如说更规范化,前两年各种培训了几个月就出来随口开价上万,几万的新手将被市场淘汰. 前端开发工具/编译工具 逐渐成型,虽然比不上objec

javascript功能插件大集合,写前端的亲们记得收藏

导读:GitHub 上有一个 Awesome – XXX 系列的资源整理.awesome-javascript 是 sorrycc 发起维护的 JS 资源列表,内容包括:包管理器.加载器.测试框架.运行器.QA.MVC框架和库.模板引擎.数据可视化.时间轴.编辑器等等. 伯乐在线已在 GitHub 上发起「JavaScript 资源大全中文版」的整理.欢迎扩散.欢迎加入. https://github.com/jobbole/awesome-javascript-cn js包下载地址:http:

自己写前端页面

由于公司人员配置的原因,不得已要自己制作页面了.对于大多数后端技术员来讲,自己写前端页面是件很痛苦的事情,但是没办法,只能是硬着头皮上了,虽然之 前也有接触一些css,除了css3的一些属性,其他的基本都知道,并了解使用,可从始至终除了拼凑一些后台页面以外,就没有真正完整的做过几个前端页面. 然后就着我所知道的那些标签跟css属性写起了页面.首先,我所知道的div+css布局: 1.    页面的左边跟右边要留白,不然分辨率一变,页面就没用了(定宽),我写的是1200px作为可视区. 2.  

运行前端React框架出现node Error: bind EADDRINUSE null的解决方法

运行前端React代码时,出现这样的错误: node Error: bind EADDRINUSE null 后来发现端口号冲突,换个端口号后问题就可以解决了. 原文地址:https://www.cnblogs.com/zhujiqian/p/12545421.html

好程序员web前端教程分享怎么用promise解决回调和异步

好程序员web前端教程分享怎么用promise解决回调和异步首先让我们看看下面这题输出什么? setTimeout(function() { console.log(1); },1000) console.log(2); 我们得到的结果是:先输出2,后输出1;这是什么原因呢?大家应该都知道定时器是异步的;所以先先输出2;那么我们的需求来了,怎么先输出1,然后输出2呢? function foo(callback) { setTimeout(function() { console.log(1);

angular2中使用iframe及前端路由踩坑未解决

前次做到英雄的路由部分,有个url的问题,这次我按照教程里面的vs2015集成方式发现styleUrls: ['./app/app.component.css']这次找不到了,要重新换成styleUrls: ['app.component.css']....你在逗我?可能是因为'my-app'的文件位置变了吧. 这个不管,这次主要写iframe的问题. vs里面建立了这样一个首页 <div> <div> @Html.Partial("_LeftLayOut")

使用&lt;jsp:include&gt;,不想写死URL,动态生成URL的解决办法

JSP中文件包含有2种方式,静态包含和动态包含.静态包含使用<%@ include file="" %>,动态包含使用<jsp:include page="" />.本文不打算介绍这2种方式的区别和使用场景,主要关注page和file属性的路径问题. 如果事先知道被包含页面的url,那么直接写死到page或file属性中即可.这种写死url的方式,没有什么不好,但是非常不灵活,不能满足动态生成url的需求.考虑这种场景,A.jsp访问B.js

写出几种IE6 BUG的解决方法

1.双边距BUG float引起的  使用display:inline 2.3像素问题 使用多个float和注释引起的 使用dislpay:inline -3px 3.超链接hover 点击后失效  使用正确的书写顺序 link visited hover active 4.Ie z-index问题 给父级添加position:relative 5.Png 透明 使用js代码 改 6.Min-height 最小高度 !Important 解决’ 7.select 在ie6下遮盖 使用iframe

让这三个月来的更猛烈些吧,前端react同构项目

昨天一篇文章讲述了我在这三个月中由.net到java的过程,其中踩坑填坑的细节真不是三言两语可以道尽,而完成时的喜悦也远非寻常可比(仅次于涨工资).然而到这并不算完结,作为前后端分离的忠实粉丝,我认为服务端更应关心数据处理.存储.负载.并发等问题,而与页面相关的开发诸如渲染.操作.样式.动画等都应交由前端人员处理. 作为一个常年在服务端玩耍的打怪青年,如果几年前有人告诉我说要把我的视图页拿出去单独开发,我会认为他在开玩笑,然而随着这几年前端超级无敌迅速的发展,前端的框架.构建工具.包管理器等不断