外部引入react组件说编译,说browserify

89354799 2019-06-20

遇到这样一个问题,在一个页面中写了一个react的组件,这是没有问题的,比如:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="js/react.min.js"></script>
    <script src="js/react-dom.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.23/browser.min.js"></script>
</head>
<body>
    <div id="wrap"></div>
    <script type="text/babel">
        ReactDOM.render(<div>Helloworld</div>,document.getElementById("wrap"));
    </script>
</body>
</html>

但我想在十个页面需要引用它,对于有多个页面要引用它,在每个页面中重复写是一个不明智的做法。
于是我就建立了一个文件命名为:helloworld.js文件,里面的代码为:

//helloworld.js
var HelloWorld = React.createClass({
    render:function(){
        return(

            <div>hello world</div>
        )
    }
})

ReactDOM.render(<HelloWorld />,document.getElementById("wrap"));

然后在引用它的页面中我这样写:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="js/react.min.js"></script>
    <script src="js/react-dom.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.23/browser.min.js"></script>
</head>
<body>
    <div id="wrap"></div>
    <script type="text/babel" src="helloworld.js"></script>
</body>
</html>

然后我在chrome浏览器中打开.html文件,浏览器没有显示任何东西。

为什么呢?

然后分析我步骤
首先从外部引入的.js是需要编译的。
我这里在浏览器中已经引入了的babel编译库(如下),在浏览器中可以编译。所以我这里是没有问题的。

<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.23/browser.min.js"></script>

于是在查看文档时,我发现了这样一句话:
Note that some browsers (Chrome, e.g.) will fail to load the file unless it's served via HTTP

哦,问题出在chrome浏览器,然后我果断试验了Firefox和Safari是没有问题的

那么对于chrome浏览器怎么办呢?我这里提供两种解决方案:

第一种:线下编译,参照官方的文档,链接如下
https://facebook.github.io/react/docs/getting-started.html#offline-transform

第二种:
这时就可以用browserify或者webpack了,我这里只介绍browserify的使用

这里使用browserify
Browserify是一个JavaScript打包工具,支持在浏览器中使用Node.js风格的require()的方法,Browserify会自动将所有的依赖打包到一个文件中,一支持模块在浏览器环境中使用,任何包含require语句的JavaScript文件运行Browserify都会自动打包所有的依赖项。

尽管十分强大,但Browserify仅支持JavaScript文件,不像Bower,Webpack或者其他打包工具支持多种文件格式。

想要Browserify良好的运行起来,必须初始化一个node项目,假设已经安装了node和npm,你可以通过终端运行下面的命令来初始化一个项目。这个命令会创建一个含有必要资源的package.json文件。

npm init
npm install  –save-dev  browserify  react react-dom babelify babel-preset-react  uglify-js

在package.json文件的末尾增加如下构建脚本,这里有一点一定要注意:

“[babelify --preset [react] ]”中"[react]"前后一定都要有空格,否则要出错

…
    “scripts”:{
        “build”:”browserify -t [babelify --preset [react]] index.js -o bundle.js”,
        “build-dist”:”NODE_ENV=production  browserify  index.js | uglifyjs  -m  >  bundle.min.js”
    }

下一步,新建文件:index.html index.js

index.html内容:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>引入组件</title>
</head>
<body>
    <div id="wrap"></div>
    <script src="bundle.js"></script>
</body>
</html>

index.js内容:

var React = require("react");
var ReactDOM = require("react-dom");
ReactDOM.render(<h1>HelloWorld</h1>,document.getElementById("wrap"));

此时文件目录为:
index.html
index.js
node_modules
package.json

然后直接在命令行中输入npm run build,就会生成bundle.js.

这时的文件目录为:
bundle.js
index.html
index.js
node_modules
package.json

打开index.html文件就可以看到页面了.

相关推荐