`
airu
  • 浏览: 270838 次
  • 性别: Icon_minigender_1
  • 来自: 云南
社区版块
存档分类
最新评论

npm+webpack+react+es6开发

阅读更多
前端技术框架
如今的前端技术日趋成熟,再也不是以前html+js+css的时代了。
当然,比起后端的成熟,前端还处于一个混乱时期,但是很多技术开始崭露头角。基本的思想也是越来越趋向于面向组件化,
版本化,可复用性等后端的思想。也许未来,前端后端又和在一起了,想起了很久以前的swing,确实怀念。

历史
所谓前端,就是用户直接接触的东西,直接面对用户。早期的html只是个标记,并不能动态展示,后来加入js脚本语言,可以
做些动态的东西,然后css也统一了样式风格,似乎一切都美好起来了。但是,大多数的框架还是动态生成html页面,类似JSP,ASP,
PHP这些,都是由后端动态生成html,然后浏览器解读。这样的问题就是,后端的数据问题和前端的页面美化问题纠缠在一起。
ajax是个革新者,不再一页一页的动态生成前端页面,而是局部更新数据。当然,无论如何,浏览器这个障碍确实是无法跨越。
各种浏览器,很难统一兼容,前端开发者还是需要操作各种浏览器的ODM元素。jquery极大简化了对DOM的操作,所以一下火了起来,
几乎无所不用。前端技术不断发展,事实上,与后端一样,我们都想一劳永逸,避开那些重复的体力劳动。这就是我们的目标是:
可复用,可扩展,可阅读,可维护……

目标
复用是最迫切的渴望,至少能够做代码搬运工。扩展可不是在原有代码上改动,而是新增的方式。可读性,也是入门门槛,可读性强的代码
至少能够使人心情舒畅。可维护,就是以上几点都加上,那么维护起来就很惬意。

如何做

安装node 6.3
好了,废话太多,直接切入主题,后端的版本依赖,打包问题,我们有maven,gradle等工具,这些工具使我们清晰的了解一个项目。
并且在测试,部署,等等问题上都可以很好的集成。那么前端呢?nodejs提供了npm,这里可以看成是maven一样的工具。
首先下载https://nodejs.org/dist/v6.9.1/node-v6.9.1-x64.msi  (linux版本请到主页下载 https://nodejs.org/en/ )
安装完成,请在命令行执行 
C:\node --version
v6.3.0
C:\npm --version
3.10.3
 
npm设置
这里只需要配置下远程的库地址
使用以下命令
npm config set registry https://registry.npm.taobao.org/
 
这里实际上可以做私有的库,使用的是国内的淘宝镜像。只是为了快点。
首次使用,在webapp目录下,使用

npm install
 
会自动安装所有模块到 node_modules 目录下。这个目录的东西请不要提交到git

安装webpack
webpack 是用来打包的,当然打包过程中也对代码做了转换,所以我们可以使用es6,而最后再es5环境中执行。具体的webpack,下面
会说到。但是首先,先安装。
npm install webpack -g
 
g 表示全局

webpack安装好以后,使用起来也是很方便,
如果需要调试,可以使用
webpack -d
 
d会生成map文件,调试需要,映射原文件

如果上线,可用
webpack -p
 
如果需要动态调试,可以加上
webpack --watch -d
 
watch选项动态监控文件改变。有改变自动重新打包。

目录结构
工具好了,那么他们在目录中是一个什么样的结构呢?

* --build
 * --common.js
 * --common.js.map
 * --main.js
 * --main.js.map
 * --
* --css
 * --base.css
* --node_modules
* --src
 * --main.js
* --index.html
* --package.json
* --webpack.config.js

build是打包后的最终目录,如果使用了d选项,那么我们可以看到map文件。
css目录存放css文件
node_modules目录下,是安装的各种组件。执行npm install时候安装的
src则是存放我们源码的地方
index.html可以理解成入口文件,最终加载我们的成果的。
<!DOCTYPE HTML>
<html>
<head>
    <meta charset="UTF-8">
    <link href="build/main.css" rel="stylesheet" type="text/css">
    <link href="build/common.css" rel="stylesheet" type="text/css">
    <title>标题</title>
</head>
<body>
    <div id="wrap"></div>
</body>
<script src="./build/common.js"></script>
<script src="./build/main.js"></script>
</html>
 
package.json 打开发现很像maven的pom文件
{
  "name": "webpk",
  "version": "1.0.0",
  "description": "mytest",
  "main": "index.js",
  "scripts": {
    "test": "test"
  },
  "repository": {
    "type": "git",
    "url": ".."
  },
  "keywords": [
    "test"
  ],
  "author": "yinsx",
  "license": "MIT",
  "devDependencies": {
    "webpack": "^1.13.3"
  },
  "dependencies": { 
    "style-loader": "^0.13.1",
    "url-loader": "^0.5.7"
  }
}
 
此文件可以用命令生成
npm init
 
接下根据提示一步一步完成即可。

最后是这个文件webpack.config.js,如果只是打包,估计也没啥讲的。
这里的配置,主要告诉webpack,打什么包,如何打包,同时如何处理各种文件(js,css,icon等)。
这里给个简易配置
var webpack = require('webpack');
var ExtractTextPlugin = require("extract-text-webpack-plugin");
var CommonsChunkPlugin = require("webpack/lib/optimize/CommonsChunkPlugin");
module.exports = {
    entry: {
        "main":"./src/main.js"
    },
    output: {
        path:'./build',
        filename:"[name].js"
    },
    module:{
        loaders:[
            {test:/\.jsx$/,loader:'babel-loader!jsx-loader?harmony'},
            //css load
            {test:/\.css$/,loader:ExtractTextPlugin.extract("style-loader","css-loader")},
            {test:/\.js$/,
                loader:'babel',
                query:{
                    cacheDirectory:true,
                    plugins:[
                        "transform-decorators-legacy",
                        "transform-class-properties",
                    ],
                    presets:["es2015","react"]}
            },
            {test:/\.(png|jpg)$/,loader:'url-loader?limit=8192'}
        ]
    },
    resolve:{
        extensions:["",".js",".jsx",".json"],
        alias: {
                    jquery: "jquery/src/jquery"
                }
    },
    plugins:[
        new ExtractTextPlugin("[name].css"),
        new CommonsChunkPlugin({
            names:['common'],
            minChunks:Infinity
        })
    ],
};
 
webpack.config.js 配置
在此过程中,我们会遇到很多问题。
第一句 require("webpack")这个webpack从何而来呢?
这就是我们开始安装的webpack,可以使用命令
npm install url-loader -save|-save-dev
 
这里save或者save-dev会把依赖存入package.json中
安装好这些组件,就可以在配置的时候使用了。
var ExtractTextPlugin = require("extract-text-webpack-plugin");
 
这句,引入一个外部插件,主要作用是把css文件独立作为.css,不打包到脚本中。这样可以使用link引用,而不是使用
style内嵌。
在plugins里,我们看到使用方法(创建):
pulugins:[
new ExtractTextPlugin("[name].css")
]
 
使用
module{
loaders:[
{test:/\.css$/,loader:ExtractTextPlugin.extract("style-loader","css-loader")},
]
}
 
CommonsChunkPlugin 这个插件则是用来提取公共的模块。这样我们能够控制把相似的模块打到一个包中。
var CommonsChunkPlugin = require("webpack/lib/optimize/CommonsChunkPlugin");
module.exports = {
    entry: {
        p1: "./page1",
        p2: "./page2",
        p3: "./page3",
        ap1: "./admin/page1",
        ap2: "./admin/page2"
    },
    output: {
        filename: "[name].js"
    },
    plugins: [
        new CommonsChunkPlugin("admin-commons.js", ["ap1", "ap2"]),
        new CommonsChunkPlugin("commons.js", ["p1", "p2", "admin-commons.js"])
    ]
};
 
entry 是入口文件(输入)可以是一个对象。
output是输出文件。
module则是各种加载器用于加载不同的语法语言
从module我们看到,加载css的,加载图片的,还有加载jsx的,加载js的
这里的加载js比较复杂。
module:{
        loaders:[
            {test:/\.jsx$/,loader:'babel-loader!jsx-loader?harmony'},
            //css load
            {test:/\.css$/,loader:ExtractTextPlugin.extract("style-loader","css-loader")},
            {test:/\.js$/,
                loader:'babel',
                query:{
                    cacheDirectory:true,
                    plugins:[
                        "transform-decorators-legacy",
                        "transform-class-properties",
                    ],
                    presets:["es2015","react"]}
            },
            {test:/\.(png|jpg)$/,loader:'url-loader?limit=8192'}
        ]
    },
 
babel是个什么东西呢?其实就是一个转化器,他把ES6的语法转化成ES5,query是获取加载器的参数。曾经在这里坑了很久,
就是因为,忽略了版本问题,网上很多都是babel5的配置,而我的版本却是 babel6
* babel6
    "babel-core":"6.18.2",
    "babel-loader":"6.2.7",
 
* babel 5
 "babel-core": "^5.8.25",
 "babel-loader": "^5.3.2",
 
对于6的配置,可以参考前面的配置,对于5,则可以参考一下配置
module: {
        loaders: [{
            test: /\.js$/,
            loader: 'babel-loader',
            query: {
                optional: ["es7.decorators", "es7.classProperties"]
            }
        }, {
            test: /\.jsx$/,
            loader: 'babel-loader!jsx-loader?harmony'
        },{test:/\.css$/, loader: ExtractTextPlugin.extract("style-loader", "css-loader")},
        {test: /\.scss$/, loader: ExtractTextPlugin.extract("style-loader", "css-loader!sass-loader")},
        {test: /\.less$/, loader: ExtractTextPlugin.extract("style-loader", "css-loader!less-loader")},
        { test: /\.(png|jpg|gif)$/, loader: 'url-loader?name=img/[hash:8].[name].[ext]' },
            { test: /\.(eot|ttf|svg|woff)$/, loader: 'url-loader?name=font/[hash:8].[name].[ext]' }]
    },
 
resolve 其实简化了我们的后缀,也就是不需要写后缀。比如 require("abc")
使用别名alias也可以配置搜索路径,jquery就是一个独特的路径
module.exports = {
  resolve: {
    alias: {
      js: path.join(__dirname, "src/scripts"),
      src: path.join(__dirname, "src/scripts"),
      styles: path.join(__dirname, "src/styles"),
      img: path.join(__dirname, "src/img")
    },
    root: [
      path.join(__dirname, "bower_components")
    ]
  },
  plugins: [
    new webpack.ResolverPlugin(
        new webpack.ResolverPlugin.DirectoryDescriptionFilePlugin(".bower.json", ["main"])
      )
  ]
}
 

好了,到目前,基本的配置就完成了。那么下面是我们如何开发呢?

编写代码

代码编写,最终有个html页面加载我们开发的页面。
还记得index.html吗?
里面有个div id="wrap"
这里就是入口的关键,看我们的代码src/main.js
import React,{ Component } from 'react';
import ReactDom from 'react-dom';

require("../css/base.css");

class Frame extends Component {
    constructor(props) {
        super(props);
    }

    render() {
        return <div className="frame">
            <div className='header'>{this.props.contents}</div>
        </div>
    }
};

class Page extends Component {
    constructor(props) {
        super(props);
    }
    render(){
        return <div className="homePage">
                <Frame contents="longen1">this is comment </Frame>
                <Frame contents="logen2"> this is another comment </Frame>
                </div>
    }
};
export default Page;

ReactDom.render(<Page></Page>,document.getElementById("wrap"));
 

如果你是写java的,或者c# C++的都应该会有亲切感吧。这就是后端
化的前台代码。
在这个过程中,如果找不到相应的组件,请手动安装
npm install xxx 
 
如果只是开发打包或编译的时候需要,那么--save-dev即可,如果是上线后用,则--save
执行了save后,可以再package.json中看到相应的项,这比maven的pom方便多了。

最后一句 
ReactDom.render(<Page></Page>,document.getElementById("wrap"));
 
实现了与开始的index.html对接

接下来,就是要学习react,ES6的语法了。




 

1
0
分享到:
评论

相关推荐

    基于react+es6+webpack的项目架构模板

    这个"基于react+es6+webpack的项目架构模板"是为开发者提供一个起点,帮助他们快速搭建具备最佳实践的项目框架。 React是Facebook开源的一款用于构建用户界面的JavaScript库,尤其适合构建单页应用(SPA)。它采用...

    Electron + React + Node.js + ES6 开发环境全配置好

    3. **配置React:** 安装`create-react-app`或手动配置Babel和Webpack,确保ES6语法支持。 4. **热更新:** 可能包含如`react-hot-loader`或`electron-reload`等工具,实现在开发过程中实时更新代码无需重启应用。 5...

    nodejs + webpack + react

    1. `.babelrc`:这是Babel的配置文件,用于将ES6+的JavaScript代码转换为浏览器兼容的ES5版本,使得React的JSX语法和其他现代特性能在旧版本浏览器中运行。 2. `webpack.config.js`:这是Webpack的基础配置文件,...

    浅谈react+es6+webpack的基础配置

    浅谈React+ES6+Webpack的基础配置 React是一款流行的前端框架,ES6是最新的ECMAScript语法规范,Webpack是一个强大的模块打包工具。本文将带领大家从头开始,学习如何配置React+ES6+Webpack的基础环境。 一、安装...

    react, 一个react+redux+webpack+ES6+antd的SPA的后台管理底层框架.zip

    这个"react+redux+webpack+ES6+antd"的后台管理底层框架,是一个完整的开发环境配置,旨在帮助开发者快速搭建后台管理系统。它整合了以上技术,使得开发者可以直接专注于业务逻辑,而无需过多关注基础架构的搭建。...

    React+Webpack4.0+ES6+Antd最新版环境搭建代码-2018年

    在IT行业中,前端开发是至关重要的领域,而React、Webpack 4.0、ES6和Ant Design这四个组件是现代JavaScript应用开发的核心工具。本文将详细介绍如何使用这些技术搭建一个最新的前端开发环境。 React,由Facebook...

    Webpack+React+ES6+JSX+CSS实例

    在这个"Webpack+React+ES6+JSX+CSS实例"中,我们将探讨如何整合这些技术来构建一个React组件,并结合CSS进行打包。 React 是一个用于构建用户界面的JavaScript库,尤其擅长构建单页应用。它基于组件化思维,允许...

    React+Webpack4

    这使得Babel能够识别并转换ES6+和React语法。 6. **配置Webpack配置文件**:创建一个`webpack.config.js`文件,定义Webpack的规则和插件。以下是一个基础配置示例: ```javascript const path = require('path')...

    react-webpack-es6:React 0.14 + Webpack + ES6

    Babel是一个JavaScript编译器,用于将ES6+的代码转换为向后兼容的JavaScript版本,确保浏览器能够正确执行。在React项目中,Babel会将JSX语法转换为React.createElement调用。 **总结** "react-webpack-es6"项目...

    react-基于ReactReduxReactRouterWebpack的前端脚手架

    - Babel配置:将ES6+和JSX转换为浏览器兼容的JavaScript。 - 源代码结构:包括`src`目录,通常包含组件、样式、路由配置等。 - 热模块替换(Hot Module Replacement):在开发过程中,修改代码后无需手动刷新浏览器...

    react-starter-kit:一个简单的最小化React入门工具包。 (React + Webpack + WebpackDevServer + ES6 + Babel + React热重装。)

    react-starter-kit 一个简单的最小化React入门工具... (React + Webpack + WebpackDevServer + ES6 + Babel + React热重装。) 以后需要添加更多模块。 ##安装npm install npm start 访问: http://localhost:3000/

    react+webpack多页面程序

    React+Webpack多页面程序是一种常见的前端开发架构,它结合了React库的强大组件化能力与Webpack的模块打包功能,用于构建大型、复杂的应用程序。在这个项目中,开发者可以为每个独立的页面创建一个单独的入口点,...

    react-webpack:构建react + webpack + es6环境

    这是一个建造webpack + react项目脚手架的简易教程,参照了的配置方式。每一个例子都有非常详细的建造步骤。 运行并启动项目 克隆项目到本地以后,选择要运行的示例进入到该项目路径下 安装: npm install 运行: ...

    React+webpack4x+bootstrap

    React+webpack4x+bootstrap 是一个常见的前端开发组合,用于构建高效、响应式的Web应用程序。这个项目整合了React(一个JavaScript库,用于构建用户界面),webpack 4.x(一个模块打包工具),以及Bootstrap(一个...

    react-cnode:基于webpack + react + react-router + redux + less + flex.css + ES6的React版本cnode社区

    基于webpack + react + react-router + redux +更少+ flex.css + ES6的React版cnode社区 演示 下载 git clone https://github.com/lzxb/react-cnode.git cd react-cnode npm install (安装依赖模块) npm install...

    React+Webpack+babel项目搭建(webpack热编译)

    本文将详细介绍如何搭建基于React、Webpack和Babel的开发环境,并通过`webpack-dev-server`实现热更新功能。 #### 二、环境准备 1. **安装Node.js**: 确保已安装最新版本的Node.js,可以通过官网下载或使用包管理器...

    npm+react + dva+ant搭建的项目

    项目构建可能使用如Webpack或Vite这样的工具,同时可能利用Babel进行ES6+语法转换,确保浏览器兼容性。CSS预处理器如Less或Sass也可能被使用,以便编写更易维护的样式。 总结起来,这个项目运用了当前前端开发的...

    project_init:React + Webpack + ES6 + Redux + Ant设计

    基于React + Webpack + React-Router + ES6 + Redux + Int Design init 安装node.js https://nodejs.org/en/ 安装淘宝镜像 npm install -g cnpm 安装全局Webpack cnpm install -g webpack 安装package.json中的...

Global site tag (gtag.js) - Google Analytics