Webpack 作为前端构建工具,对于大型网站开发,大大提升了开发效率。要使用webpack需要先安装webpack工具;

先来看一个最简单的命令

  1. $ webpack main.js bundle.js

该命令将 main.js 输出到 bundle.js 。

通常,都不会这样直接使用使用,而是在项目根目录下进行打包配置,配置文件默认为webpack.config.js。

  1. // webpack.config.js
  2. module.exports = {
  3. entry: './main.js',
  4. output: {
  5. filename: 'bundle.js'
  6. }
  7. };

之后,直接在命令行中使用 webpack 就能进行打包了!

除了直接使用 webpack 进行打包之外,还可以对打包命令进行一些选择性的配置:

  • webpack – for building once for development
  • webpack -p – for building once for production (minification)
  • webpack --watch – for continuous incremental build
  • webpack -d – to include source maps
  • webpack --colors – for making things pretty

同样,这些配置也可以写进 package.json 配置文件中

  1. // package.json
  2. {
  3. // ...
  4. "scripts": {
  5. "dev": "webpack-dev-server --devtool eval --progress --colors",
  6. "deploy": "NODE_ENV=production webpack -p"
  7. },
  8. // ...
  9. }

1. entry

  1. // webpack.config.js
  2. module.exports = {
  3. entry: './main.js',
  4. output: {
  5. filename: 'bundle.js'
  6. }
  7. };

entry 除了使用一个单一的 js 文件之外,还可以使用多个 js 文件;

  1. module.exports = {
  2. entry: {
  3. bundle1: './main1.js',
  4. bundle2: './main2.js'
  5. },
  6. output: {
  7. filename: '[name].js'
  8. }
  9. };

2. Babel-loader

Loader 是源代码转换预处理器(more info). 例如, Babel-loader 可以将 JSX/ES6 转换成 JS 文件. 参见官方文档:loaders.

  1. // main.jsx is a JSX file.
  2.  
  3. const React = require('react');
  4. const ReactDOM = require('react-dom');
  5.  
  6. ReactDOM.render(
  7. <h1>Hello, world!</h1>,
  8. document.querySelector('#wrapper')
  9. );

index.html

  1. <html>
  2. <body>
  3. <div id="wrapper"></div>
  4. <script src="bundle.js"></script>
  5. </body>
  6. </html>

webpack.config.js

  1. module.exports = {
  2. entry: './main.jsx',
  3. output: {
  4. filename: 'bundle.js'
  5. },
  6. module: {
  7. loaders:[
  8. {
  9. test: /\.js[x]?$/,
  10. exclude: /node_modules/,
  11. loader: 'babel-loader?presets[]=es2015&presets[]=react'
  12. },
  13. ]
  14. }
  15. };

module.loaders 用于指定 loaders. 上面的代码片段使用了 babel-loader,也用到了babel-preset-es2015babel-preset-react 用来转换 ES6 和 React。也可以使用如下的query的方式来配置:

  1. module: {
  2. loaders: [
  3. {
  4. test: /\.jsx?$/,
  5. exclude: /node_modules/,
  6. loader: 'babel',
  7. query: {
  8. presets: ['es2015', 'react']
  9. }
  10. }
  11. ]
  12. }

3. CSS-loader

Webpack 使我们可以通过 require 引用一个css文件并结合css-loader处理之后输出成一个模块。

main.js

  1. require('./app.css');

app.css

  1. body {
  2. background-color: blue;
  3. }

index.html

  1. <html>
  2. <head>
  3. <script type="text/javascript" src="bundle.js"></script>
  4. </head>
  5. <body>
  6. <h1>Hello World</h1>
  7. </body>
  8. </html>

webpack.config.js

  1. module.exports = {
  2. entry: './main.js',
  3. output: {
  4. filename: 'bundle.js'
  5. },
  6. module: {
  7. loaders:[
  8. { test: /\.css$/, loader: 'style-loader!css-loader?modules' },
  9. ]
  10. }
  11. };

注意,这里使用了两个loader来转换css文件。 CSS-loader 用来读取CSS文件, Style-loader用来插入样式到网页中. 不同的loader用 ! 来连接.

在浏览器中浏览网页,index.html中已经插入了样式表。

  1. <head>
  2. <script type="text/javascript" src="bundle.js"></script>
  3. <style type="text/css">
  4. body {
  5. background-color: blue;
  6. }
  7. </style>
  8. </head>

4. Image loader

Webpack 还可以通过 require 引用图片文件。

main.js

  1. var img1 = document.createElement("img");
  2. img1.src = require("./small.png");
  3. document.body.appendChild(img1);
  4.  
  5. var img2 = document.createElement("img");
  6. img2.src = require("./big.png");
  7. document.body.appendChild(img2);

index.html

  1. <html>
  2. <body>
  3. <script type="text/javascript" src="bundle.js"></script>
  4. </body>
  5. </html>

webpack.config.js

  1. module.exports = {
  2. entry: './main.js',
  3. output: {
  4. filename: 'bundle.js'
  5. },
  6. module: {
  7. loaders:[
  8. { test: /\.(png|jpg)$/, loader: 'url-loader?limit=8192' }
  9. ]
  10. }
  11. };

这里使用了 url-loader 来转换图片文件. 如果图片小于 8192 bytes 将会被转换成 Data URL; 否则将会被转换成普通的URL. ? 用来给url-loader传入参数.

两张不同大小的图片会被转换成不同的格式如下:

  1. <img src="data:image/png;base64,iVBOR...uQmCC">
  2. <img src="4853ca667a2b8b8844eb2693ac1b2578.png">

5. CSS Module

css-loader?modules 表示打开 CSS Modules 的功能。它表示module中定义的css样式默认是局部作用域;如果需要转换成全局作用域可以通过 :global(.abc) (more info)

index.html

  1. <html>
  2. <body>
  3. <h1 class="h1">Hello World</h1>
  4. <h2 class="h2">Hello Webpack</h2>
  5. <div id="example"></div>
  6. <script src="./bundle.js"></script>
  7. </body>
  8. </html>

app.css

  1. .h1 {
  2. color:red;
  3. }
  4.  
  5. :global(.h2) {
  6. color: blue;
  7. }

main.jsx

  1. var React = require('react');
  2. var ReactDOM = require('react-dom');
  3. var style = require('./app.css');
  4.  
  5. ReactDOM.render(
  6. <div>
  7. <h1 className={style.h1}>Hello World</h1>
  8. <h2 className="h2">Hello Webpack</h2>
  9. </div>,
  10. document.getElementById('example')
  11. );

webpack.config.js

  1. module.exports = {
  2. entry: './main.jsx',
  3. output: {
  4. filename: 'bundle.js'
  5. },
  6. module: {
  7. loaders:[
  8. {
  9. test: /\.js[x]?$/,
  10. exclude: /node_modules/,
  11. loader: 'babel-loader',
  12. query: {
  13. presets: ['es2015', 'react']
  14. }
  15. },
  16. {
  17. test: /\.css$/,
  18. loader: 'style-loader!css-loader?modules'
  19. }
  20. ]
  21. }
  22. };

6. UglifyJs Plugin

Webpack 有插件支持用来扩展更多的需求。 UglifyJs Plugin 将会最小化输出的js文件.

main.js

  1. var longVariableName = 'Hello';
  2. longVariableName += ' World';
  3. document.write('<h1>' + longVariableName + '</h1>');

webpack.config.js

  1. var webpack = require('webpack');
  2. var uglifyJsPlugin = webpack.optimize.UglifyJsPlugin;
  3. module.exports = {
  4. entry: './main.js',
  5. output: {
  6. filename: 'bundle.js'
  7. },
  8. plugins: [
  9. new uglifyJsPlugin({
  10. compress: {
  11. warnings: false
  12. }
  13. })
  14. ]
  15. };

运行项目,main.js 将被输出成如下格式:

  1. var o="Hello";o+=" World",document.write("<h1>"+o+"</h1>")

注意:如果需要结合使用到postcss,webpack.config.js文件需要有一些小的修改如下:

  1. var values = require("postcss-modules-values");
  2. var webpack = require('webpack');
  3. var uglifyJsPlugin = webpack.optimize.UglifyJsPlugin;
  4.  
  5. module.exports = {
  6. entry: __dirname + "/index.js",
  7. output: {
  8. path:"public",
  9. publicPath: "/",
  10. filename: "bundle.js"
  11. },
  12. module: {
  13. loaders:[
  14. {
  15. test: /\.js$/,
  16. exclude: /node_modules/,
  17. loader:'babel-loader'
  18. },
  19. {
  20. test: /\.css$/,
  21. loader: "style-loader!css-loader?modules!postcss-loader"
  22. }
  23. ]
  24. },
  25. plugins:[
  26. new uglifyJsPlugin({
  27. compress:{
  28. warnings: false
  29. }
  30. }),
  31. new webpack.LoaderOptionsPlugin({
  32. test:/\.css$/,
  33. options: {
  34. postcss:[values]
  35. }
  36. })
  37. ]
  38. };

备注: UglifyJsPlugin还可以对一些指定的变量不进行混淆

  1. plugins: [
  2. new webpack.optimize.UglifyJsPlugin({
  3. mangle: {
  4. except: ['$super', '$', 'exports', 'require']
  5. //以上变量‘$super’, ‘$’, ‘exports’ or ‘require’,不会被混淆
  6. },
  7. compress: {
  8. warnings: false
  9. }
  10. })
  11. ]

7. HTML Webpack Plugin and Open Browser Webpack Plugin

下面来看如何加载第三方插件

html-webpack-plugin 可以创建index.html, open-browser-webpack-plugin 可以打开一个浏览器窗口当 Webpack 加载完成之后。

  1. npm install html-webpack-plugin open-browser-webpack-plugin webpack-dev-server --save

main.js

  1. document.write('<h1>Hello World</h1>');

webpack.config.js

  1. var HtmlwebpackPlugin = require('html-webpack-plugin');
  2. var OpenBrowserPlugin = require('open-browser-webpack-plugin');
  3.  
  4. module.exports = {
  5. entry: './main.js',
  6. output: {
  7. filename: 'bundle.js'
  8. },
  9. plugins: [
  10. new HtmlwebpackPlugin({
  11. title: 'Webpack-demos',
  12. filename: 'index.html'
  13. }),
  14. new OpenBrowserPlugin({
  15. url: 'http://localhost:8080'
  16. })
  17. ]
  18. };

运行 webpack-dev-server.

  1. $ webpack-dev-server

现在不需要手动创建index.html文件,也不需要去打开浏览器窗口了,一切由webpack为我们包办了!

可能遇到的错误: Error: Cannot find module 'webpack/lib/node/NodeTemplatePlugin' ,解决办法:在项目中重新安装webpack。

8. Environment flags

可以通过一些配置来对开发环境和正式环境进行一些不同的操作;

main.js

  1. document.write('<h1>Hello World</h1>');
  2.  
  3. if (__DEV__) {
  4. document.write(new Date());
  5. }

webpack.config.js

  1. var webpack = require('webpack');
  2.  
  3. var devFlagPlugin = new webpack.DefinePlugin({
  4. __DEV__: JSON.stringify(JSON.parse(process.env.DEBUG || 'false'))
  5. });
  6.  
  7. module.exports = {
  8. entry: './main.js',
  9. output: {
  10. filename: 'bundle.js'
  11. },
  12. plugins: [devFlagPlugin]
  13. };

运行webpack打包并输入环境变量配置:

  1. # Linux & Mac
  2. $ env DEBUG=true webpack-dev-server
  3.  
  4. # Windows
  5. $ set DEBUG=true
  6. $ webpack-dev-server

process.env 默认为一个空对象,通过 env DEBUG=true命令 为env.DEBUG赋值。

9. Code splitting

对于大型web网站,不可能将所有的js文件都放到一个文件中一次性加载, Webpack 允许我们将js文件进行分割。

首先,你需要使用 require.ensure 来定义分割点 (official document)

  1. // main.js
  2. require.ensure(['./a'], function(require) {
  3. var content = require('./a');
  4. document.open();
  5. document.write('<h1>' + content + '</h1>');
  6. document.close();
  7. });

require.ensure 告诉 Webpack,./a.js 文件应该从bundle.js文件中分割出来并编译到一个单独的文件中。

  1. // a.js
  2. module.exports = 'Hello World';

现在webpack将会自动进行编译打包,不需要再进行额外的配置。

webpack.config.js

  1. module.exports = {
  2. entry: './main.js',
  3. output: {
  4. filename: 'bundle.js'
  5. }
  6. };

从表象上看,没有任区别,但实际上webpack将main.js和a.js编译到两个不同的文件中了,分别是bundle.js和1.bundle.js文件,当需要用到的时候再加载1.bundle.js文件;

10. Code splitting with bundle-loader

另一个代码分割的方法是使用 bundle-loader.

  1. // main.js
  2.  
  3. // Now a.js is requested, it will be bundled into another file
  4. var load = require('bundle-loader!./a.js');
  5.  
  6. // To wait until a.js is available (and get the exports)
  7. // you need to async wait for it.
  8. load(function(file) {
  9. document.open();
  10. document.write('<h1>' + file + '</h1>');
  11. document.close();
  12. });

require('bundle-loader!./a.js') 告诉 Webpack 需要从另外的js文件中去加载 a.js。webpack的行为将和上面相同。

11. Common chunk

当多个script文件需要使用到相同的chunk的时候,可以将这个公用的模块通过CommonsChunkPlugin提取到单独的文件中。

  1. // JQ01.js
  2. var $ = require("jquery");
  3. $('#a').text("001");
  4.  
  5. // JQ02.js
  6. var $ = require("jquery");
  7. $('#b').text("002");

上面的两个不同的组件中,都同时需要用到 JQuery,甚至会有更多的组件也会如此,此时可以将 JQuery 提取出来,放置到一个公共的 js 文件中。

index.html

  1. <html>
  2. <body>
  3. <div id="a"></div>
  4. <div id="b"></div>
  5. <script src="vendor.js"></script>
  6. <script src="bundle1.js"></script>
  7. <script src="bundle2.js"></script>
  8. </body>
  9. </html>

webpack.config.js

  1. var CommonsChunkPlugin = require("webpack/lib/optimize/CommonsChunkPlugin");
  2.  
  3. module.exports = {
  4. entry: {
  5. bundle1: "./JQ01.js",
  6. bundle2: "./JQ02.js",
  7. vendor: ["jquery"] // option
  8. },
  9. output: {
  10. filename: "[name].js"
  11. },
  12. plugins: [
  13. new CommonsChunkPlugin({
  14. name: 'vendor',
  15. filename: "vendor.js"
  16. })
  17. ]
  18. };

随着库越来越大,vendor文件也变得越来越大,于是考虑打包成两个vendor,把和react相关的库打包成一个vendor,其他的库打包成另外一个vendor。

  1. ...
  2. entry: {
  3. "vendor1": ["react", "react-dom", "react-router", "react-router-redux", "react-redux", "redux"],
  4. "vendor2": ["jquery"],
  5. "app": "./js/index.js"
  6. },
  7. ...
  8. plugins: [
  9. new webpack.optimize.CommonsChunkPlugin({
  10. names: ["vendor2", "vendor1"],
  11. minChunks: Infinity
  12. })
  13. ],
  14. ...

有两个需要注意的地方:

  • 在CommonsChunkPlugin里面,vender的顺序要反着来,要和加载顺序相反。比如你想按vendor1,vendor2的顺序加载,entry里面写的是vendor1,vendor2,在CommonsChunkPlugin里面要写vendor2,vendor1。
  • output.filename一定不要写死了,要配置成可替换的,类似filename: '[name].js'形式。

12. Vendor chunk

也可以通过 CommonsChunkPlugin 来分割提取出js库。

main.js

  1. var $ = require('jquery');
  2. $('h1').text('Hello World');

index.html

  1. <html>
  2. <body>
  3. <h1></h1>
  4. <script src="vendor.js"></script>
  5. <script src="bundle.js"></script>
  6. </body>
  7. </html>

webpack.config.js

  1. var webpack = require('webpack');
  2.  
  3. module.exports = {
  4. entry: {
  5. app: './main.js',
  6. vendor: ['jquery'],
  7. },
  8. output: {
  9. filename: 'bundle.js'
  10. },
  11. plugins: [
  12. new CommonsChunkPlugin({
  13. name: 'vendor',
  14. filename: "vendor.js"})
  15. ]
  16. };

ProvidePlugin

  1.  

如果你希望一个module可以作为一个变量使用到其它地方,比如使用jQuery的 $ ,我们可以在任何地方使用而不需要通过 require("jquery"),这就需要用到 ProvidePlugin (Official doc).

  1. // main.js
  2. $('h1').text('Hello World');

webpack.config.js

  1. var webpack = require('webpack');
  2.  
  3. module.exports = {
  4. entry: {
  5. app: './main.js'
  6. },
  7. output: {
  8. filename: 'bundle.js'
  9. },
  10. plugins: [
  11. new webpack.ProvidePlugin({
  12. $: "jquery",
  13. jQuery: "jquery",
  14. "window.jQuery": "jquery"
  15. })
  16. ]
  17. };

13. Exposing global variables

如果我们想使用一些全局变量,但又不想把它们包含在webpack中,这时候可以通过在webpack.config.js中 配置 externals 来实现 official document

data.js.

  1. var data = 'Hello World';

将data数据暴露成全局变量

  1. // webpack.config.js
  2. module.exports = {
  3. entry: './main.jsx',
  4. output: {
  5. filename: 'bundle.js'
  6. },
  7. module: {
  8. loaders:[
  9. {
  10. test: /\.js[x]?$/,
  11. exclude: /node_modules/,
  12. loader: 'babel-loader',
  13. query: {
  14. presets: ['es2015', 'react']
  15. }
  16. },
  17. ]
  18. },
  19. externals: {
  20. // require('data') is external and available
  21. // on the global var data
  22. 'data': 'data'
  23. }
  24. };

现在,通过 var data = require('data') 可以将data.js输出到模块变量中。但实际上data是一个全局变量。

  1. // main.jsx
  2. var data = require('data');
  3. var React = require('react');
  4. var ReactDOM = require('react-dom');
  5.  
  6. ReactDOM.render(
  7. <h1>{data}</h1>,
  8. document.body
  9. );

14. Hot Module Replacement

Hot Module Replacement (HMR) 当网页发生改变的时候,不需要手动刷新页面。结合webpack-dev-server有两种方式来打开 HMR。

(1) 在命令中指定 --hot 和 --inline

  1. $ webpack-dev-server --hot --inline

Meaning of the options:

  • --hot: adds the HotModuleReplacementPlugin and switch the server to hot mode.
  • --inline: embed the webpack-dev-server runtime into the bundle.
  • --hot --inline: also adds the webpack/hot/dev-server entry.

(2) 配置 webpack.config.js.

  • add new webpack.HotModuleReplacementPlugin() to the plugins field
  • add webpack/hot/dev-server and webpack-dev-server/client?http://localhost:8080 to the entry field

webpack.config.js

  1. var webpack = require('webpack');
  2. var path = require('path');
  3.  
  4. module.exports = {
  5. entry: [
  6. 'webpack/hot/dev-server',
  7. 'webpack-dev-server/client?http://localhost:8080',
  8. './index.js'
  9. ],
  10. output: {
  11. filename: 'bundle.js',
  12. publicPath: '/static/'
  13. },
  14. plugins: [
  15. new webpack.HotModuleReplacementPlugin()
  16. ],
  17. module: {
  18. loaders: [{
  19. test: /\.jsx?$/,
  20. exclude: /node_modules/,
  21. loader: 'babel-loader',
  22. query: {
  23. presets: ['es2015', 'react']
  24. },
  25. include: path.join(__dirname, '.')
  26. }]
  27. }
  28. };
  1. Now launch the dev server.
  1. $ webpack-dev-server

在浏览器中打开 http://localhost:8080 查看网页。保持网页打开,对网页修改一些内容,观察浏览器是否发生改变;

App.js

  1. import React, { Component } from 'react';
  2.  
  3. export default class App extends Component {
  4. render() {
  5. return (
  6. <h1>Hello World</h1>
  7. );
  8. }
  9. }

index.js

  1. import React from 'react';
  2. import ReactDOM from 'react-dom';
  3. import App from './App';
  4.  
  5. ReactDOM.render(<App />, document.getElementById('root'));

index.html

  1. <html>
  2. <body>
  3. <div id='root'></div>
  4. <script src="/static/bundle.js"></script>
  5. </body>
  6. </html>

15. React router

参考 React-router 官方示例

  1. +---------------------------------------------------------+
  2. | +---------+ +-------+ +--------+ |
  3. | |Dashboard| | Inbox | |Calendar| Logged in as Jane |
  4. | +---------+ +-------+ +--------+ |
  5. +---------------------------------------------------------+
  1. $ webpack-dev-server --history-api-fallback 

参考连接:

Webpack 官方文档 : http://webpack.github.io/docs/configuration.html

Webpack 配置示例的更多相关文章

  1. Webpack配置示例和详细说明

    /* * 请使用最新版本nodejs * 默认配置,是按生产环境的要求设置,也就是使用 webpack -p 命令就可以生成正式上线版本. * 也可以使用 webpack -d -w 命令,生成用于开 ...

  2. webpack配置示例

    var webpack = require('webpack'); var commonsPlugin = new webpack.optimize.CommonsChunkPlugin('commo ...

  3. webpack配置这一篇就够

    最近看了一篇好文,根据这个文章重新梳理了一遍webpack打包过程,以前的一些问题也都清楚了,在这里分享一下,同时自己也做了一些小的调整 原文链接:http://www.jianshu.com/p/4 ...

  4. vue-cli中webpack配置详解

    vue-cli是构建vue单页应用的脚手架,命令行输入vue init <template-name> <project-name>从而自动生成的项目模板,比较常用的模板有we ...

  5. webpack 配置分离css插件

    以css配置示例,less与sass同理 1. 使用旧版的ExtractTextPlugin插件 安装 npm install extract-text-webpack-plugin@next --s ...

  6. 通用、封装、简化 webpack 配置

    通用.封装.简化 webpack 配置 现在,基本上前端的项目打包都会用上 webpack,因为 webpack 提供了无与伦比强大的功能和生态.但在创建一个项目的时候,总是免不了要配置 webpac ...

  7. Element源码:项目初始化和webpack配置

    0x00.项目初始化 由于整个过程像素级 copy element,所以将不使用vue-cli初始化项目. 创建项目 新建一个空的文件夹,使用npm init 来初始化项目,并安装vue模块. 修改目 ...

  8. [webpack] 配置react+es6开发环境

    写在前面 每次开新项目都要重新安装需要的包,简单记录一下. 以下仅包含最简单的功能: 编译react 编译es6 打包src中入口文件index.js至dist webpack配置react+es6开 ...

  9. webpack配置详解

    webpack配置详解 先点个赞吧,再挨个点下面的连接,觉得不值这个赞的回来骂我啊. Webpack傻瓜式指南(一) Webpack傻瓜指南(二)开发和部署技巧 Webpack傻瓜式指南 原生的官网详 ...

随机推荐

  1. 【RL系列】Multi-Armed Bandit笔记补充(二)

    本篇的主题是对Upper Conference Bound(UCB)策略进行一个理论上的解释补充,主要探讨UCB方法的由来与相关公式的推导. UCB是一种动作选择策略,主要用来解决epsilon-gr ...

  2. Bootstrap学习--栅格系统

    响应式布局页面:即同一套页面可以兼容不同分辨率的设备. Bootstrap依赖于栅格系统实现响应式布局,将一行均分为12个格子,可以指定元素占几个格子. 实现过程 1.定义容器,相当于之前的table ...

  3. nice和renice命令详解

    基础命令学习目录首页 进程调度是linux中非常重要的概念.linux内核有一套高效复杂的调度机制,能使效率极大化,但有时为了实现特定的要求,需要一定的人工干预.比如,你希望操作系统能分配更多的CPU ...

  4. maven实战读书笔记(一)

    环境变量设置 MAVEN_HOME:G:\maven-3.2\apache-maven-3.2.5 Path: G:\maven-3.2\apache-maven-3.2.5\bin 其实正确的设置应 ...

  5. sprint2(第二天)

    昨天没有想到餐桌的功能,今天加到展板.然后今天我们完成了餐桌模板,可以实现添加桌子的桌号.人数.修改和删除功能.不过由于今天学校网络不是很好,晚上我们clone了很久都没clone下来,所以没有上传代 ...

  6. 软件工程-东北师大站-第九次作业(PSP)

    1.本周PSP 2.本周进度条 3.本周累计进度图 代码累计折线图 博文字数累计折线图 4.本周PSP饼状图

  7. 【请仔细核对Git地址】关于代码量排名的说明

    1.截至2017年3月14日,1623班级代码统计情况如下: 2.代码量排名是基于码云的git地址统计的,请大家仔细核对以下个人地址,如有问题请及时联系我. 20162301 20162302 201 ...

  8. 场景调研 persona

    1.姓名:王涛 2.年龄:22 3.收入:基本无收入 4.代表用户在市场上的比例和重要性:王涛为铁道学生.本软件的用户主要是学生和老师,尤其是广大的铁大学子,所以此典型用户的重要性不言而喻,而且比例相 ...

  9. ORACLE_SQL

    --建立学生表create table Student (       Sno char(9) primary key,       Sname char(20)unique,       Sex  ...

  10. java 数字转中文

    java代码 数字转中文,该方法只做了对int型整数的转换 private static String numberToChinese(int number) { String[] numbers = ...