zoukankan      html  css  js  c++  java
  • React & Webpack & Typescript & scss

    引用:React & Webpack

    假设已经在使用Node.js和npm。

    初始化项目结构

    让我们新建一个目录。 将会命名为 proj,但是你可以改成任何你喜欢的名字。

    mkdir proj
    cd proj
    

    我们会像下面的结构组织我们的工程:

    proj/
    ├─ dist/
    └─ src/
       └─ components/
    

    TypeScript文件会放在src文件夹里,通过TypeScript编译器编译,然后经webpack处理,最后生成一个bundle.js文件放在dist目录下。 我们自定义的组件将会放在 src/components文件夹下。
    先创建基本结构:

    mkdir src
    cd src
    mkdir components
    cd ..
    

    Webpack会帮助我们生成dist目录。

    初始化工程

    现在把这个目录变成npm包。

    npm init
    

    你会看到一些提示,放心地使用默认值就可以了。 当然,你也可以随时到生成的 package.json文件里修改。

    安装依赖

    确保安装typescript

    npm install -g typescript
    

    首先确保已经全局安装了Webpack。Webpack这个工具可以将你的所有代码和可选择地将依赖捆绑成一个单独的.js文件。

    npm install -g webpack
    npm install webpack-cli -g
    

    Webpack这个工具可以将你的所有代码和可选择地将依赖捆绑成一个单独的.js文件。
    现在我们添加React和React-DOM以及它们的声明文件到package.json文件里做为依赖:

    npm install --save react react-dom @types/react @types/react-dom
    

    使用@types/前缀表示我们额外要获取React和React-DOM的声明文件。 通常当你导入像 "react"这样的路径,它会查看react包; 然而,并不是所有的包都包含了声明文件,所以TypeScript还会查看 @types/react包。 你会发现我们以后将不必在意这些。

    接下来,我们要添加开发时依赖awesome-typescript-loader和source-map-loader。

    npm install --save-dev typescript awesome-typescript-loader source-map-loader
    

    这些依赖会让TypeScript和webpack在一起良好地工作。 awesome-typescript-loader可以让Webpack使用TypeScript的标准配置文件 tsconfig.json编译TypeScript代码。 source-map-loader使用TypeScript输出的sourcemap文件来告诉webpack何时生成 自己的sourcemaps。 这就允许你在调试最终生成的文件时就好像在调试TypeScript源码一样。

    添加TypeScript配置文件

    我们想将TypeScript文件整合到一起 - 这包括我们写的源码和必要的声明文件。
    我们需要创建一个tsconfig.json文件,它包含了输入文件列表以及编译选项。 在工程根目录下新建文件 tsconfig.json文件,添加以下内容:

    {
        "compilerOptions": {
            "outDir": "./dist/",
            "sourceMap": true,
            "noImplicitAny": true,
            "module": "commonjs",
            "target": "es5",
            "jsx": "react"
        },
        "include": [
            "./src/**/*"
        ]
    }
    

    写些代码

    下面使用React写一段TypeScript代码。 首先,在 src/components目录下创建一个名为Hello.tsx的文件,代码如下:

    import * as React from "react";
    
    export interface HelloProps { compiler: string; framework: string; }
    
    // 'HelloProps' describes the shape of props.
    // State is never set so we use the '{}' type.
    export class Hello extends React.Component<HelloProps, {}> {
        render() {
            return <h1>Hello from {this.props.compiler} and {this.props.framework}!</h1>;
        }
    }
    

    接下来,在src下创建index.tsx文件,源码如下:

    import * as React from "react";
    import * as ReactDOM from "react-dom";
    
    import { Hello } from "./components/Hello";
    
    ReactDOM.render(
        <Hello compiler="TypeScript" framework="React" />,
        document.getElementById("example")
    );
    

    我们仅仅将Hello组件导入index.tsx。 注意,不同于 "react"或"react-dom",我们使用Hello.tsx的相对路径 - 这很重要。 如果不这样做,TypeScript只会尝试在 node_modules文件夹里查找。

    我们还需要一个页面来显示Hello组件。 在根目录 proj创建一个名为index.html的文件,如下:

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="UTF-8" />
            <title>Hello React!</title>
        </head>
        <body>
            <div id="example"></div>
    
            <!-- Dependencies -->
            <script src="../node_modules/react/umd/react.development.js"></script>
            <script src="../node_modules/react-dom/umd/react-dom.development.js"></script>
    
            <!-- Main -->
            <script src="../dist/bundle.js"></script>
        </body>
    </html>
    

    需要注意一点我们是从node_modules引入的文件。 React和React-DOM的npm包里包含了独立的 .js文件,你可以在页面上引入它们,这里我们为了快捷就直接引用了。 可以随意地将它们拷贝到其它目录下,或者从CDN上引用。

    创建一个webpack配置文件

    在工程根目录下创建一个webpack.config.js文件。

    module.exports = {
        entry: "./src/index.tsx",
        output: {
            filename: "bundle.js",
            path: __dirname + "/dist"
        },
    
        // Enable sourcemaps for debugging webpack's output.
        devtool: "source-map",
    
        resolve: {
            // Add '.ts' and '.tsx' as resolvable extensions.
            extensions: [".ts", ".tsx", ".js", ".json"]
        },
    
        module: {
            rules: [
                // All files with a '.ts' or '.tsx' extension will be handled by 'awesome-typescript-loader'.
                { test: /.tsx?$/, loader: "awesome-typescript-loader" },
    
                // All output '.js' files will have any sourcemaps re-processed by 'source-map-loader'.
                { enforce: "pre", test: /.js$/, loader: "source-map-loader" }
            ]
        },
    
        // When importing a module whose path matches one of the following, just
        // assume a corresponding global variable exists and use that instead.
        // This is important because it allows us to avoid bundling all of our
        // dependencies, which allows browsers to cache those libraries between builds.
        externals: {
            "react": "React",
            "react-dom": "ReactDOM"
        }
    };
    

    大家可能对externals字段有所疑惑。 我们想要避免把所有的React都放到一个文件里,因为会增加编译时间并且浏览器还能够缓存没有发生改变的库文件。

    理想情况下,我们只需要在浏览器里引入React模块,但是大部分浏览器还没有支持模块。 因此大部分代码库会把自己包裹在一个单独的全局变量内,比如: jQuery或_。 这叫做“命名空间”模式,webpack也允许我们继续使用通过这种方式写的代码库。 通过我们的设置 "react": "React",webpack会神奇地将所有对"react"的导入转换成从React全局变量中加载。

    整合在一起

    执行:

    webpack
    

    在浏览器里打开index.html,工程应该已经可以用了! 你可以看到页面上显示着“Hello from TypeScript and React!”

    关联上scss:

    npm install style-loader css-loader sass-loader node-sass
    

    在webpack.config.js的module里添加

                {
                    test: /.scss$/,
                    loaders: ['style-loader', 'css-loader', 'sass-loader'],
                },
    

    新建Hello.scss文件,在需要的tsx内关联:

    require('./Hello.scss');
    
  • 相关阅读:
    Python3 Selenium自动化web测试 ==> 第十一节 WebDriver高级应用 -- 显示等待 + 二次封装
    Python3 Selenium自动化web测试 ==>FAQ:Unittest测试报告生成文件名加测试完成时间字符串
    Python3 Selenium自动化web测试 ==>FAQ:日期格式和日期字符串格式相互转换
    学习目录
    dotnet学习系列
    Vue.js——60分钟browserify项目模板快速入门
    Vue.js——使用$.ajax和vue-resource实现OAuth的注册、登录、注销和API调用
    Vue.js——vue-resource全攻略
    Vue.js——基于$.ajax实现数据的跨域增删查改
    Vue.js——组件快速入门(下篇)
  • 原文地址:https://www.cnblogs.com/xym4869/p/13293642.html
Copyright © 2011-2022 走看看