【React+TS】从零开始搭建react+typescript+router+redux+less+pxToVw自适应+sass+axios反向代理+别名@+Antd-mobile

2023-11-14

一、通过create-react-app脚手架创建项目

npx create-react-app testproject --template typescript

 在vscode中打开项目,可以看到顺利生成了react项目且组件的后缀为tsx,此时说明成功创建了react+typescript项目的雏形

 在项目根目录下,运行npm run start,成功启动项目

npm run start

二、配置路由

npm i react-router-dom@5.2.0 react-router-config @types/react-router-config @types/react-router-dom -S

src目录下创建views文件夹,views内创建Home,Contact,About,Navbar四个tsx文件,其中Navbar用来控制路由,其他三个页面用来展示

Home:

import React, { Component } from "react";

export default class Home extends Component {
  render() {
    return (
      <div className="home">
        <div className="container">
          <h3 className="center"> Home页面</h3>
          <p>欢迎来到首页</p>
        </div>
      </div>
    );
  }
}

Contact:

import React, { Component } from "react";

export default class Contact extends Component {
  render() {
    return (
      <div className="contact">
        <div className="container">
          <h3 className="center"> Contact页面</h3>
          <p>欢迎来到联系我们页面!</p>
        </div>
      </div>
    );
  }
}

About:

import React, { Component } from "react";

export default class About extends Component {
  render() {
    return (
      <div className="about">
        <div className="container">
          <h3 className="center"> About页面</h3>
          <p>欢迎来到关于我们页面!</p>
        </div>
      </div>
    );
  }
}

Navbar:

import React, { Component } from "react";

export default class Navbar extends Component {
    render() {
        return (
            <nav className="nav-wrapper">
                <div className="list">
                    <ul>
                        <li><a href='/'>Home</a></li>
                        <li><a href='/about'>About</a></li>
                        <li><a href='/contact'>Contact</a></li>
                    </ul>
                </div>
            </nav>
        )
    }
}

src目录下创建routes文件夹,同时创建index.ts,使用RouteConfig对路由进行统一管理

// 导入路由组件
import Home from '../views/Home'
import About from '../views/About'
import Contact from '../views/Contact'
// 导入路由管理工具
import {RouteConfig} from 'react-router-config'

const routes:RouteConfig = [
  {
    path:'/',
    exact:true,
    component:Home
  },
  {
    path:'/about',
    exact:true,
    component:About
  },
  {
    path:'/contact',
    exact:true,
    component:Contact
  }
]

export default routes;

 App.tsx中引入Route,Navbar和路由管理工具

import React from "react";
// 引入路由导航栏
import Navbar from "./views/Navbar";
// 引入routes组件
import routes from "./routes";
// 引入包管理工具
import { renderRoutes, RouteConfig } from "react-router-config";
import "./App.css";

function App() {
  return (
    <div className="App">
      <Navbar />

      {/* 设置routes的类型为RouteConfig[],否则报错 */}
      {renderRoutes(routes as RouteConfig[])}
    </div>
  );
}

export default App;

根目录index.tsx中这样定义

import React from "react";
import ReactDOM from "react-dom";
import "./index.css";
import App from "./App";
import reportWebVitals from "./reportWebVitals";
import { BrowserRouter as Router } from "react-router-dom";

ReactDOM.render(
  <React.StrictMode>
    <Router>
      <App />
    </Router>
  </React.StrictMode>,
  document.getElementById("root")
);

// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();

 至此,路由配置就完成了,启动项目如果出现以下错误,

 运行命令

npm i react-router@5.2.0 -s

 然后重新运行即可,你的页面应该是这样的

 有点难看是吧,我们给App添加一点样式

* {
  padding: 0;
  margin: 0;
}

h1 {
  text-align: center;
  font-size: 45px;
  font-family: Arial, Helvetica, sans-serif;
  color: rgb(6, 0, 32);
  padding: 40px;
}

.list {
  display: flex;
  justify-content: center;
  width: 100%;
}

.list ul li {
  list-style: none;
  margin: 42px;
  text-align: center;
}

a {
  text-decoration: none;
  color: rgb(0, 0, 0);
  font-size: 18px;
  font-family: Arial, Helvetica, sans-serif;
  padding: 14px 25px;
  background-color: transparent;
  border: 2px solid rgb(12, 0, 66);
}

a:hover {
  background-color: rgb(12, 0, 66);
  color: rgb(255, 255, 255);
}

三、配置less

 第一种方式:暴露配置的方式

npm run eject

此时项目多出了config文件夹

 

安装lessless-loader

npm i less less-loader -S

仿照sass修改config目录下的webpack.config.js:

1. 找到config目录下的webpack.config.js文件,在50-70行之间有个cssRegex,在此处添加

 

后面步骤与下面相同

这种方式有个不好的地方,就是会产生很多不必要的js文件,且这个操作不可逆,等到后期项目上传时造成代码冗余,不好维护。

第二种方式:找到config.js文件直接修改

1.找到文件路径:node_modules\react-scripts\config\webpack.config.js

 2.在60-80行之间有个cssRegex,在此处添加

// less
const lessRegex = /\.less$/;
const lessModuleRegex = /\.module\.less$/;

3. 在550多行有个sassRegex,模仿写对应的lessRegex

{
              test: lessRegex,
              exclude: lessModuleRegex,
              use: getStyleLoaders(
                {
                  importLoaders: 3,
                  sourceMap: isEnvProduction
                    ? shouldUseSourceMap
                    : isEnvDevelopment,
                  modules: {
                    mode: 'icss',
                  },
                },
                'less-loader'
              ),
              // Don't consider CSS imports dead code even if the
              // containing package claims to have no side effects.
              // Remove this when webpack adds a warning or an error for this.
              // See https://github.com/webpack/webpack/issues/6571
              sideEffects: true,
            },
            // Adds support for CSS Modules, but using SASS
            // using the extension .module.scss or .module.sass
            {
              test: lessModuleRegex,
              use: getStyleLoaders(
                {
                  importLoaders: 3,
                  sourceMap: isEnvProduction
                    ? shouldUseSourceMap
                    : isEnvDevelopment,
                  modules: {
                    mode: 'local',
                    getLocalIdent: getCSSModuleLocalIdent,
                  },
                },
                'less-loader'
              ),
            },

3.重新启动项目,创建less文件并引入

.about{
  .container{
    font-size: 22px;
    p{
      color: red;
    }
  }
  }

样式生效,说明less配置成功

四、配置sass

通过create-react-app创建的react项目,其实是默认已经配置好sass的,所以我们先尝试在项目中引入sass文件

会发生如下报错:

解决方法:执行下面的命令

npm i sass -s

 然后重新运行即可,样式生效

五、配置px2rem/pxToVw自适应

说明:修改px2rem为pxToVw格式,现在保留两种方式供大家选择。

(一)、px2rem

第一种方式:暴露config

1. 安装lib-flexible、pxtorem,postcss

npm i lib-flexible postcss-pxtorem postcss postcss-loader postcss-preset-env postcss-flexbugs-fixes -s

2.配置config/webpack.config.js,在config目录下找到webpack.config.js文件,加入

const px2rem = require('postcss-pxtorem');

3. 然后再下面代码中加入下面这行

px2rem({
       rootValue: 75,
       propWhiteList: [],
       minPixelValue: 2,
       exclude: /node_modules/i,
       unitPrecision: 5,
       propList: ['*']
}), //设计稿根据750px(iphone6)

 也可以使用一下代码覆盖loader

      {
        // Options for PostCSS as we reference these options twice
        // Adds vendor prefixing based on your specified browser support in
        // package.json
        loader: require.resolve('postcss-loader'),
        options: {
          postcssOptions: {
            // Necessary for external CSS imports to work
            // https://github.com/facebook/create-react-app/issues/2677
            ident: 'postcss',
            config: false,
            plugins: !useTailwind
              ? [
                  'postcss-nested',
                  'postcss-flexbugs-fixes',
                  [
                    'postcss-preset-env',
                    {
                      autoprefixer: {
                        flexbox: 'no-2009',
                      },
                      stage: 3
                    },
                  ],
                  // Adds PostCSS Normalize as the reset css with default options,
                  // so that it honors browserslist config in package.json
                  // which in turn let's users customize the target behavior as per their needs.
                  px2rem({
                    rootValue: 37.5,
                    selectorBlackList  : [], //过滤
                    propList   : ['*'],
                    minPixelValue: 2,
                    exclude: /node_modules/i
                  }), //设计稿根据750px(iphone6)
                'postcss-normalize',
                ]
              : [
                  'tailwindcss',
                  'postcss-flexbugs-fixes',
                  [
                    'postcss-preset-env',
                    {
                      autoprefixer: {
                        flexbox: 'no-2009',
                      },
                      stage: 3,
                    },
                  ],
                  px2rem({
                    rootValue: 37.5,
                    selectorBlackList  : [], //过滤
                    propList   : ['*'],
                    minPixelValue: 2,
                    exclude: /node_modules/i
                    }), //设计稿根据750px(iphone6)
                ],
          },
          sourceMap: isEnvProduction ? shouldUseSourceMap : isEnvDevelopment,
        },
      },

4. src目录下找到index入口文件,在文件上面加入

import 'lib-flexible'; 


5. 找到public/index.html文件,加入如下代码:

<meta content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"
        name="viewport"/>


6. 重新运行项目,一般就可以看到px转rem了。

.contact {
  .container {
    font-size: 36px;

    .center {
      color: blue;
    }
    p {
      font-size: 24px;
    }
    button {
      width: 100px;
      height: 45px;
      background: #ccc;
      color: #fff;
    }
  }
}

 第二种方式:直接在config文件中修改

1.找到文件路径:node_modules\react-scripts\config\webpack.config.js

 2-6.与上面的步骤一样

存在问题:当设备宽度超过540后,样式就固定在540不再改变了

解决方法:在node-modules => lib-flexible => flexible.js中找到refreshRem修改其中的width值为设计稿宽度即可

(二)、pxToVw

也区分为暴露配置和不暴露配置两种方式,和上面的步骤一样

1. 安装postcss-px-to-viewport

npm install postcss-px-to-viewport -D

2.配置config/webpack.config.js,在config目录下找到webpack.config.js文件,加入

// pxToVw
const postcsspxtoviewport = require('postcss-px-to-viewport')

 

3. 搜索'postcss-loader',找到后在下方添加如下代码,两个数组中都要添加相同的代码,以防开发环境和生产环境样式布局不一致

postcsspxtoviewport({
    unitToConvert: 'px', // 要转化的单位
    viewportWidth: 750, // UI设计稿的宽度
    unitPrecision: 6, // 转换后的精度,即小数点位数
    propList: ['*'], // 指定转换的css属性的单位,*代表全部css属性的单位都进行转换        
    viewportUnit: 'vw', // 指定需要转换成的视窗单位,默认vw
    fontViewportUnit: 'vw', // 指定字体需要转换成的视窗单位,默认vw
    selectorBlackList: ['ignore-'], // 指定不转换为视窗单位的类名,
    minPixelValue: 1, // 默认值1,小于或等于1px则不进行转换
    mediaQuery: true, // 是否在媒体查询的css代码中也进行转换,默认false
    replace: true, // 是否转换后直接更换属性值
    landscape: false // 是否处理横屏情况
}),

 也可使用以下代码覆盖postcss-loader

{
        // Options for PostCSS as we reference these options twice
        // Adds vendor prefixing based on your specified browser support in
        // package.json
        loader: require.resolve('postcss-loader'),
        options: {
          postcssOptions: {
            // Necessary for external CSS imports to work
            // https://github.com/facebook/create-react-app/issues/2677
            ident: 'postcss',
            config: false,
            plugins: !useTailwind
              ? [
                  'postcss-flexbugs-fixes',
                  postcsspxtoviewport({
                    unitToConvert: 'px', // 要转化的单位
                    viewportWidth: 750, // UI设计稿的宽度
                    unitPrecision: 6, // 转换后的精度,即小数点位数
                    propList: ['*'], // 指定转换的css属性的单位,*代表全部css属性的单位都进行转换
                    viewportUnit: 'vw', // 指定需要转换成的视窗单位,默认vw
                    fontViewportUnit: 'vw', // 指定字体需要转换成的视窗单位,默认vw
                    selectorBlackList: ['ignore-'], // 指定不转换为视窗单位的类名,
                    minPixelValue: 1, // 默认值1,小于或等于1px则不进行转换
                    mediaQuery: true, // 是否在媒体查询的css代码中也进行转换,默认false
                    replace: true, // 是否转换后直接更换属性值
                    landscape: false // 是否处理横屏情况
                  }),
                  [
                    'postcss-preset-env',
                    {
                      autoprefixer: {
                        flexbox: 'no-2009',
                      },
                      stage: 3,
                    },
                  ],
                  // Adds PostCSS Normalize as the reset css with default options,
                  // so that it honors browserslist config in package.json
                  // which in turn let's users customize the target behavior as per their needs.
                  'postcss-normalize',
                ]
              : [
                  'tailwindcss',
                  postcsspxtoviewport({
                    unitToConvert: 'px', // 要转化的单位
                    viewportWidth: 750, // UI设计稿的宽度
                    unitPrecision: 6, // 转换后的精度,即小数点位数
                    propList: ['*'], // 指定转换的css属性的单位,*代表全部css属性的单位都进行转换
                    viewportUnit: 'vw', // 指定需要转换成的视窗单位,默认vw
                    fontViewportUnit: 'vw', // 指定字体需要转换成的视窗单位,默认vw
                    selectorBlackList: ['ignore-'], // 指定不转换为视窗单位的类名,
                    minPixelValue: 1, // 默认值1,小于或等于1px则不进行转换
                    mediaQuery: true, // 是否在媒体查询的css代码中也进行转换,默认false
                    replace: true, // 是否转换后直接更换属性值
                    landscape: false // 是否处理横屏情况
                  }),
                  'postcss-flexbugs-fixes',
                  [
                    'postcss-preset-env',
                    {
                      autoprefixer: {
                        flexbox: 'no-2009',
                      },
                      stage: 3,
                    },
                  ],
                ],
          },
          sourceMap: isEnvProduction ? shouldUseSourceMap : isEnvDevelopment,
        },
      },

4.重新运行项目,一般就可以看到px转vw了。

 

六、配置axios和反向代理

1. 安装axios 和 http-proxy-middleware(后面反向代理会用到)

npm i axios http-proxy-middleware -s

2. 在src目录下创建api文件夹,然后创建 index.ts 和 request.ts 文件

//index.ts

import {Service} from './request';
//获取汽车列表
export function getCarList(config: { page: string; }){
    const params = new URLSearchParams()
    params.append('page',config.page);

    return Service({
        url:'./api/getCarList',
        data:params
    })
}


//request.ts

import axios from "axios";

declare module 'axios' {
     export interface AxiosResponse<T = any> extends Promise<T> {}
 }

export const Service = axios.create({
  timeout: 3000, //延迟时间
  method: "POST",
  headers: {
    "pc-token": "4a82b23dbbf3b23fd8aa291076e660ec",
    "content-Type": "application/x-www-form-urlencoded",
  },
});

//请求拦截
Service.interceptors.request.use((config) => config);

//响应拦截
Service.interceptors.response.use(
  (response) => response.data,
  (err) => console.log(err)
);

3. 配置代理,可以访问到后台的服务器地址

在src文件夹中创建setupProxy.js内容配置如下

const {createProxyMiddleware} = require('http-proxy-middleware');

module.exports = function(app) {
  app.use('/api', createProxyMiddleware({ 
    target: 'http://www.ibugthree.com/oldcar/',//后台服务器地址
    changeOrigin: true,
    pathRewrite: {
    '^/api': '',
    },}))
};

在新版本中已经默认设置代理的文件夹名为setupProxy.js

  到这里所有配置就基本完成,在组件中调用即可

import React, { Component } from "react";
import "./contact.scss";
//导入要使用的接口
import { getCarList } from "../api/index";

export default class Contact extends Component {
  // 定义方法
  getList() {
    getCarList({ page: "1" }).then((res) => console.log(res));
  }
  render() {
    return (
      <div className="contact">
        <div className="container">
          <h3 className="center"> Contact页面</h3>
          <p>欢迎来到联系我们页面!</p>
          {/* 点击事件调用 */}
          <button onClick={this.getList}>获取数据</button>
        </div>
      </div>
    );
  }
}

 

 七、配置redux

1. 安装redux

npm i redux react-redux -s

2.在src路径下创建store文件夹,文件假中创建两个文件action.ts和index.ts两个文件

action中定义type,然后返回设置状态的type和函数

export const SET_AGE = "set_age";
export const SET_NAME = "set_name";

export const setAge = function (n: number) {
  return {
    type: SET_AGE,
    n: n,
  };
};
export const setName = function (name: string) {
  return {
    type: SET_NAME,
    name: name,
  };
};

index文件中取出redux中的createStore,以及action中的type,最后需要将createStore返回出去,并且需要传递一个函数,定义这个函数时有两个参数,一个是状态,一个是action,使用switch判断action中的type,当所有条件都不成立时,将所有的状态返回,有条件成立时,就通过扩展运算符将state展开,并且对age进行操作(...state);

import { createStore } from "redux";
import { SET_AGE, SET_NAME } from "./action";

interface User {
  name: string;
  age: number;
}

const common: User = {
  name: "张三123",
  age: 18,
};

function user(state = common, action: any) {
  switch (action.type) {
    case SET_AGE:
      return {
        ...state,
        age: state.age + action.n,
      };
    case SET_NAME:
      return {
        ...state,
        name: action.name,
      };
    default:
      return state;
  }
}

export default createStore(user);

3. 在主入口文件index.tsx中进行redux的连接和store的引用

import React from "react";
import ReactDOM from "react-dom";
import "./index.css";
import App from "./App";
import reportWebVitals from "./reportWebVitals";
// 引入路由组件
import { BrowserRouter as Router } from "react-router-dom";
// 引入移动端自适应
import "lib-flexible";
//引入rootReducer组件
import { Provider } from "react-redux";
import store from "./store";

ReactDOM.render(
  <React.StrictMode>
    {/* provider组件将所有的组件包裹起来,用绑定属性的形式绑定store到组件中 */}
    <Provider store={store}>
      <Router>
        <App />
      </Router>
    </Provider>
  </React.StrictMode>,
  document.getElementById("root")
);

reportWebVitals();

4. 在App中进行配置

import React from "react";
// 引入路由导航栏
import Navbar from "./views/Navbar";
// 引入routes组件
import routes from "./routes";
// 引入包管理工具
import { renderRoutes, RouteConfig } from "react-router-config";
import "./App.css";
// 引入connect连接组件
import {connect} from "react-redux"


function App() {
  return (
    <div className="App">
      <Navbar />
      {/* 设置routes的类型为RouteConfig[],否则报错 */}
      {renderRoutes(routes as RouteConfig[])}
    </div>
  );
}

//进行连接
export default connect((props,state)=>Object.assign({},props,state),{})(App);

5.组件中使用redux

    1. 引入connect和action中的方法

    2. 定义props和state类型

    3. 修改render中的html结构,定义属性和方法调用

    4. connect连接属性并导出

import React, { Component } from "react";
import "./about.less";
// redux
import { connect } from "react-redux";
import { setName, setAge } from "../store/action";

interface Props {
  setAge: Function;
  setName: Function;
  age: number;
  name: string;
}

interface State {}

class About extends Component<Props,State> {
  refs:any = React.createRef()
  // eslint-disable-next-line @typescript-eslint/no-useless-constructor
  constructor(props:Props){
    super(props)
  }
  changeAge(){
    this.props.setAge(1);
    console.log(this.props);
  }
  changeName(){
    let name:number = this.refs.value
    this.props.setName(name)
    console.log(this.refs);
    this.refs.value = ''
  }
  render() {
    return (
      <div className="about">
        <div className="container">
          <h3 className="center"> About页面</h3>
          <p>欢迎来到关于我们页面!</p>
        </div>
        <div>
          <p>名字是:{this.props.name}</p>
          <input ref={(input: HTMLInputElement) => this.refs = input}  type="text" /> 
          <button onClick={this.changeName.bind(this)}>修改姓名</button>
          <p>年龄是:{this.props.age}</p> 
          <button onClick={this.changeAge.bind(this)}>修改年龄</button>
        </div>
      </div>
    );
  }
}

export default connect((props,state)=>Object.assign({},props,state),{
  setAge,setName
})(About);

八、配置别名@

一、暴露方法

1.打开 config 文件夹下的 webpack.config.js 文件

 2.搜索 alias

 3.参照如下格式,设置路径别名

alias: {
        // Support React Native Web
        // https://www.smashingmagazine.com/2016/08/a-glimpse-into-the-future-with-react-native-for-web/
        'react-native': 'react-native-web',
        '@api':path.resolve('src/api'),
        '@assets': path.resolve('src/assets'),
        '@service': path.resolve('src/service'),
        '@store': path.resolve('src/redux/store'),
        '@components': path.resolve('src/components'),
        '@pages': path.resolve('src/pages/'),
        '@utils': path.resolve('src/utils'),
        // Allows for better profiling with ReactDevTools
        ...(isEnvProductionProfile && {
          'react-dom$': 'react-dom/profiling',
          'scheduler/tracing': 'scheduler/tracing-profiling',
        }),
        ...(modules.webpackAliases || {}),
      },

二、直接在config文件中修改

1.找到文件路径:node_modules\react-scripts\config\webpack.config.js

其他步骤同上!!

需要特别注意的是: webpack配置进行改动后,都需要重新启动项目,不然不生效

九、配置antd-mobile

1.在项目中安装antd-mobile 使用

npm install antd-mobile
//或
yarn add antd-mobile

2.在项目中Home.tsx文件中导入要使用的组件

import React, { Component } from "react";
//使用组件直接在组件中进行使用即可
import { Button } from 'antd-mobile';

export default class Home extends Component {
  render() {
    return (
      <div className="home">
        <div className="container">
          <h3 className="center"> Home页面</h3>
          <p>欢迎来到首页</p>
          <Button color='primary'>按钮</Button>
        </div>
      </div>
    );
  }
}

完成之后,你就能在react项目使用antd-mobile的样式文件进行构建自己的页面了

至此,react项目创建和配置完成

如有问题,请及时沟通

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【React+TS】从零开始搭建react+typescript+router+redux+less+pxToVw自适应+sass+axios反向代理+别名@+Antd-mobile 的相关文章

随机推荐

  • 字符串匹配算法(2)BM

    2017 02 24 本篇针对BM算法 字符串匹配 进行讲解 这个算法也是看了很久 看到这里也感觉很力不从心 看来需要我把前面两篇算法实践下了 不然总觉得空空的 概述 1 对于原有的都是从左往右进行匹配的模式进行修改 改为 从右往左 也就是
  • 金融数据获取系列之一(优矿)

    金融数据获取系列之一 优矿 1 优矿平台简要介绍 2 基于优矿平台的示例 获取中国大陆股票市场 18指数 上证指数 上证综指 上证A指 上证B指 上证50 上证180 上证380 深证指数 深证成指 深证综指 深证A指 深证B指 中证指数
  • Apache配置优化总结

    Apache下载 http httpd apache org download cgi conf httpd conf分别搜索关键字ServerTokens和ServerSignature 修改 ServerTokens OS 修改为 Se
  • centos7 静默安装oracle11g

    1 下载oracle11g文件 linux x64 11gR2 database 1of2 zip 和 linux x64 11gR2 database 2of2 zip 可以下载到本地再用ftp上传到服务器 2 创建用户组和oracle用
  • go env 配置(环境变量)说明

    前提 已经安装好 golang 可正确的运行下面这段命令 来查看 go 的配置 go env 输出示例 以上是我本地 windows 环境下输出的配置信息 环境变量 我们这次就针对每个配置信息进行一个说明 具体到每个字段是什么意思 以下标注
  • 计算机的进制与性能

    计算机的性能与进制 目前计算机的进制 我们都知道目前我们所使用的计算机的进制是二进制 因为我们通常会把一个计算机看成一个集成电路 就可以用我们初中物理上面学过的电路图来表示 而对应的二进制正好只有0 1两种状态 正好符合我们的逻辑方式 TR
  • html怎么获取window,怎么获取window.open中的值

    当前位置 我的异常网 ASP NET 怎么获取window open中的值 怎么获取window open中的值 www myexceptions net 网友分享于 2013 03 03 浏览 49次 如何获取window open中的值
  • 【SBT】getting org.scala-sbt sbt 1.8.2 (this may take some time)...问题解决

    在windows环境搭建scala环境需要用到sbt 在安装完sbt后首次使用下载sbt应用程序时长时间卡在这一步 网上有两种解决方式 1 网络代理 2 国内镜像 网络代理方式尝试了很多次 均不成功 国内镜像方式同样网上出现了大量帖子列举国
  • cout与printf

    printf与流 不妨也比较一下两个的优缺点 1 先说printf的优点 也就这一点了 那就是代码简洁 格式化方便 可以在格式化字符串里一次性将输出格式化 而ostream则需要一段一段地拆分 显得比较烦锁 特别是自定义输出类型的格式时 如
  • webpack5详细配置与介绍

    webpack的基本概念 微博pack时一种前端资源构建工具 一个静态模块打包器 再webpack看来 前端的所有资源 都会当作一个模块来处理 它将会根据模块的依赖关系进行静态分析 打包生成对应的静态资源 bundle entry 入口指示
  • torch.transpose()函数

    torch transpose Tensor dim0 dim1 是pytorch中的ndarray矩阵进行转置的操作 注意 transpose 一次只能在两个维度间进行转置 也可以理解为维度转换 例如 import torch as t
  • 命令行启动anaconda

    命令行启动anaconda anaconda navigator
  • VsCode使用技巧:避免ubuntu版本右键菜单误点

    问题描述 ubuntu版本 16 04 的VsCode 1 69版本 经常在代码界面下单击右键总会点到右键菜单中的某一项上面 只有每次点下的时候把鼠标向左移动再弹起才能避免 比如我们调试时 想把某个变量添加到监视 但是单击右键菜单 老是直接
  • gitlab常用的命令

    引言 使用gitlab提交代码的时候 若是使用的命令行 则需要输入命令行指令 下面是日常遇到的常用的命令行指令 详情 git命令行常用指令的使用 git status 上次提交后是否对文件再做了修改项目1 git add 添加所有的变动 g
  • python中的pass是什么意思_Python中pass的作用与使用教程

    Python中pass的作用与使用教程 Python中pass的作用 空语句 do nothing 保证格式完整 保证语义完整 以if语句为例 在c或c java中 if true do nothing else do something
  • SQLite与MySQL、SQLServer等异构数据库之间数据同步的解决方案

    什么是SQLite DBSync SQLite DBSync是开源嵌入式数据库SQLite的数据同步引擎 实现了SQLite与SQLite数据库之间以及SQLite与异构数据库 Oracle MySQL SQLServer 之间的增量的 双
  • 用Gecco爬虫采集数据

    说起网络爬虫大家首先都会想到python爬虫 但是用Java实现爬虫的也很多 也有很多爬虫框架 今天我想说说我使用什么做爬虫的 其实我也是一个爬虫白痴 刚接触爬虫的时候都是用纯java去做 但是做到一半的时候发现要写的代码真多 所以就找Ja
  • Linux上的虚拟化技术

    虚拟化技术的方法 架构和实现概览 2006年12月29日 虚拟化技术的应用十分广泛 当前虚拟化技术主要关注于服务器的虚拟化 或在单个主机上寄存多个独立的操作系统 本文首先介绍虚拟化技术的原理 然后讨论多个虚拟化技术的实现方法 另外介绍了一些
  • 铱(Iridium)系统的通信体制

    铱系统已经是很老的系统了 但对于我们深刻了解低轨卫星通信系统还是很有帮助的 窥一斑而知全豹 铱系统是世界上第一个LEO全球卫星移动通信系统 1995年1月获得美国联邦通信委员会看许可 1997年5月发射第一颗卫星 1998年5月完成星座布置
  • 【React+TS】从零开始搭建react+typescript+router+redux+less+pxToVw自适应+sass+axios反向代理+别名@+Antd-mobile

    一 通过create react app脚手架创建项目 npx create react app testproject template typescript 在vscode中打开项目 可以看到顺利生成了react项目且组件的后缀为tsx